File: lisp.tf

package info (click to toggle)
tf5 5.0beta8-7
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 3,800 kB
  • sloc: ansic: 25,492; perl: 103; makefile: 82; sh: 79
file content (53 lines) | stat: -rw-r--r-- 1,167 bytes parent folder | download | duplicates (16)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
;;; 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