local utils = import 'utils.libsonnet'; /* A C-style comment. */ # A Python-style comment. // Define a "local" function. // Default arguments are like Python: local my_function(x, y=10) = x + y; local object = { // A method my_method(x): x * x, }; local string1 = 'Farmer\'s Gin'; local string_newline1 = 'this is a valid string with newlines'; local string_newline2 = "this is also a valid string"; local timcollins = ||| The Tom Collins is essentially gin and lemonade. The bitters add complexity. |||; local obj = { "foo": 1, "bar": { "arr": [1, 2, 3], "number": 10 + 7, }, }; // Define a local function. // Default arguments are like Python: local my_function(x, y=10) = x + y; // Define a local multiline function. local multiline_function(x) = // One can nest locals. local temp = x * 2; // Every local ends with a semi-colon. [temp, temp + 1]; local object = { // A method my_method(x): x * x, }; local large = true; { // Functions are first class citizens. call_inline_function: (function(x) x * x)(5), call_multiline_function: multiline_function(4), // Using the variable fetches the function, // the parens call the function. call: my_function(2), // Like python, parameters can be named at // call time. named_params: my_function(x=2), // This allows changing their order named_params2: my_function(y=3, x=2), // object.my_method returns the function, // which is then called like any other. call_method1: object.my_method(3), standard_lib: std.join(' ', std.split("foo/bar", '/')), len: [ std.length('hello'), std.length([1, 2, 3]), ], cocktails: { local factor = if large then 2 else 1, // Ingredient quantities are in fl oz. 'Tom Collins': { ingredients: [ { kind: string1, qty: 1.5*factor }, { kind: 'Lemon', qty: 1 }, { kind: 'Simple Syrup', qty: 0.5E+1 }, { kind: 'Soda', qty: 2 }, { kind: 'Angostura', qty: 'dash' }, ], garnish: 'Maraschino Cherry', served: 'Tall', description: timcollins, }, }, }