Create an object/Native demonstration: Difference between revisions

Line 493:
Cannot modify an immutable Bool
in block <unit> at native-demonstration.p6:15</pre>
 
=={{header|Phix}}==
There is no native "read-only" setting on phix dictionaries, so the following wraps a pair of them to
provide the requested functionality.
<lang Phix>enum STD, CUR
sequence fkds = {} -- fixed key dictionaries ;-)
integer freelist = 0
 
procedure fkd_destroy(integer id)
integer {std,cur} = fkds[id]
destroy_dict(std)
destroy_dict(cur)
fkds[id] = freelist
freelist = id
end procedure
 
function fkd_new(sequence key_pairs)
integer std = new_dict(key_pairs),
cur = new_dict(std),
id = freelist
if id=0 then
fkds = append(fkds,{std,cur})
id = length(fkds)
else
freelist = fkds[id]
fkds[id] = {std,cur}
end if
return id
end function
 
procedure fkd_clear(integer id)
integer {std,cur} = fkds[id]
destroy_dict(cur)
fkds[id][CUR] = new_dict(std)
end procedure
 
function fkd_get(integer id, object key)
return getd(key,fkds[id][CUR])
end function
 
procedure fkd_set(integer id, object key, data)
integer node = getd_index(key,fkds[id][CUR])
if node=NULL then throw("invalid/new key") end if
setd(key,data,fkds[id][CUR])
end procedure
 
procedure fkd_remove(integer id, object key)
integer {std,cur} = fkds[id],
node = getd_index(key,std)
if node=NULL then throw("invalid key") end if
setd(key,getd_by_index(node,std),cur)
end procedure
 
function fkd_sprint(integer id)
integer cur = fkds[id][CUR]
sequence res = getd_all_keys(cur)
for i=1 to length(res) do
object ri = res[i]
res[i] = {ri,getd(ri,cur)}
end for
return res
end function
 
procedure main()
integer id = fkd_new({{"a",1},{"b",2}})
?fkd_sprint(id) -- {{"a",1},{"b",2}}
fkd_set(id,"a",55)
fkd_set(id,"b",66)
?fkd_sprint(id) -- {{"a",55},{"b",66}}
fkd_clear(id)
?fkd_sprint(id) -- {{"a",1},{"b",2}}
fkd_set(id,"a",55)
fkd_set(id,"b",66)
?fkd_get(id,"a") -- 55
fkd_remove(id,"a")
try
fkd_set(id,"NoNewKey",77)
catch e
?e[E_USER] -- "invalid/new key"
end try
?fkd_sprint(id) -- {{"a",1},{"b",66}}
fkd_destroy(id)
end procedure
main()</lang>
 
=={{header|Python}}==
7,794

edits