retroforth/example/defstruct.retro
crc a0df55a325 fix a memory leak in a:make (and therefore { }). Thanks to Bob Oelschlaeger for reporting this.
FossilOrigin-Name: 9641454f6661cf138f3707bb25d92d506dcd9ad0f8dd99f49e1c60279ba52180
2020-09-08 16:45:06 +00:00

37 lines
904 B
Forth

LISP provides a function, `defstruct`, which creates a data
structure and functions for accessing various fields in it.
This can be useful, so I'm doing something similar here.
(defstruct book title author subject book-id )
~~~
{{
:make-helper (nsq-) [ d:create , ] dip does ;
:make-struct (ns-) d:create , [ here swap fetch allot ] does ;
---reveal---
:defstruct (sa-)
dup a:length
[ n:dec swap
[ 'ab 'aabab reorder
'@ s:append [ fetch + fetch ] make-helper
'! s:append [ fetch + store ] make-helper
n:dec
] a:for-each drop
] sip swap make-struct ;
}}
~~~
```
'book { 'title 'author 'subject 'book-id } defstruct
book 'A const
'The_Hobbit s:keep &A title!
'J.R.R._Tolkien s:keep &A author!
'Fantasy s:keep &A subject!
:info (a-)
[ subject@ ] [ author@ ] [ title@ ] tri
'%s_by_%s_is_a_%s_book. s:format s:put nl ;
&A info
```