3 ms·
In Lil[0], this is how ordinary assignment syntax works. Implicitly defining a dictionary stored in a variable named "cat" with a field "age": cat.age:3
by RodgerTheGreat 6mo ago
In Lil[0], this is how ordinary assignment syntax works. Implicitly defining a dictionary stored in a variable named "cat" with a field "age":
cat.age:3
# {"age":3}
Defining "l" as in the example in the article. We need the "list" operator to enlist nested values so that the "," operator doesn't concatenate them into a flat list:
l:1,(list 2,list cat),4
# (1,(2,{"age":3}),4)
Updating the "age" field in the nested dictionary. Lil's basic datatypes are immutable, so "l" is rebound to a new list containing a new dictionary, leaving any previous references undisturbed:
l[1][1].age:9
# (1,(2,{"age":9}),4)
cat
# {"age":3}
There's no special "infix" promotion syntax, so that last example would be:
l:l,5
# (1,(2,{"age":9}),4,5)
[0] http://beyondloom.com/tools/trylil.html http://beyondloom.com/tools/trylil.html
- leontrolski 6mo agoThis is surprising to me: l[1][1].age:9 # (1,(2,{"age":9}),4) How come it doesn't return just: {"age":9} Or is there something totally different going on with references here? As in, how is this different to: l_inner = l[1][1] l_inner.age:9
- RodgerTheGreat 6mo agoAmending a slice would amend only the slice: l_inner:l[1][1] # {"age":3} l_inner.age:9 # {"age":9} l_inner # {"age":9} l # (1,(2,{"age":3}),4) If an amending expression isn't "rooted" in a variable binding, it also returns the entire new structure: (1,(list 2,list ().age:5),4)[1][1].age:99 # (1,(2,{"age":99}),4)