;;; Lisp-like macros
; These macros return values via /result, so they can be used in $() command
; subs, or as functions in expressions.
/loaded __TFLIB__/lisp.tf
/def -i car = /result {1}
/def -i cdr = /result {-1}
/def -i cadr = /result {2}
/def -i cddr = /result {-2}
/def -i caddr = /result {3}
/def -i cdddr = /result {-3}
/def -i length = /result {#}
/def -i reverse = \
/let _result=%1%;\
/while (shift(), {#}) \
/let _result=%1 %_result%;\
/done%;\
/result _result
/def -i mapcar = \
/let _cmd=%1%; \
/while (shift(), {#}) \
/eval %_cmd %%1%; \
/done
/def -i maplist = \
/let _cmd=%1%;\
/while (shift(), {#}) \
/eval %_cmd %%*%;\
/done
/def -i remove = \
/let _word=%1%;\
/let _result=%;\
/while (shift(), {#}) \
/if (_word !~ {1}) \
/let _result=%{_result} %{1}%;\
/endif%;\
/done%;\
/result _result
;; Remove all duplicate items from list.
;; Note that the speed of this macro is O(N^2), so it is very slow on
;; long lists.
/def -i unique = \
/let _result=%1 $[{#}>1 ? $(/unique $(/remove %1 %-1)) : ""]%; \
/result _result