Skip to content

Commit

Permalink
add non-primitive dict.len
Browse files Browse the repository at this point in the history
  • Loading branch information
dalnefre committed Dec 29, 2024
1 parent 7e0e859 commit 04852f5
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions lib/dict.asm
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,23 @@ del_none: ; k orig key rev next value' key'
drop 5 ; k orig
ref std.return_value

len: ; ( dict -- len )
push 0 ; dict k len
roll 3 ; k len dict
len_iter: ; k len dict
quad -4 ; k len next value' key' type
eq #dict_t ; k len next value' key' type==#dict_t
if_not len_done ; k len next value' key'
drop 2 ; k len next
roll 2 ; k next len
push 1 ; k next len 1
alu add ; k next len+1
roll 2 ; k len+1 next
ref len_iter
len_done: ; k len next value' key'
drop 3 ; k len
ref std.return_value

; example usage
example:
dict_t 1 #nil
Expand All @@ -123,6 +140,16 @@ demo_del:
push 3
call del
drop 1
demo_len:
push #nil ; #nil
call len ; len=0
assert 0 ; --
push example ; example
call len ; len=3
assert 3 ; --
push #? ; #?
call len ; len=0
assert 0 ; --
return

; self-checked demo
Expand Down Expand Up @@ -201,5 +228,6 @@ test: ; judge <- {caps}
add
set
del
len ; not primitive
boot
test

0 comments on commit 04852f5

Please sign in to comment.