Create an object/Native demonstration: Difference between revisions
Content added Content deleted
Line 493: | Line 493: | ||
Cannot modify an immutable Bool |
Cannot modify an immutable Bool |
||
in block <unit> at native-demonstration.p6:15</pre> |
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}}== |
=={{header|Python}}== |