home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / dev / e / amigae / src / tools / lisp / lisp.e next >
Text File  |  1992-09-02  |  2KB  |  134 lines

  1. -> list Tools!
  2.  
  3. OPT MODULE
  4. OPT EXPORT
  5.  
  6. /*------some-typical-lisp-functions--------*/
  7.  
  8. /* note: these are quite inefficient functions and could be done
  9.    much faster using destructive implementations. They are however
  10.    very nice as LISP-programming examples */
  11.  
  12. -> appends two lists
  13.  
  14. PROC append(x,y)
  15.   DEF h,t
  16.   IF x
  17.     x <=> <h|t>
  18.     RETURN <h|append(t,y)>
  19.   ENDIF
  20. ENDPROC y
  21.  
  22. -> 'naive'-reverses a list. notorious for it's inefficiency.
  23.  
  24. PROC nrev(x)
  25.   DEF h,t
  26.   IF x
  27.     x <=> <h|t>
  28.     RETURN append(nrev(t),<h>)
  29.   ENDIF
  30. ENDPROC NIL
  31.  
  32. -> returns a list of results from applying fun to elements of l
  33.  
  34. PROC map(l,fun)
  35.   DEF h,t
  36.   IF l
  37.     l <=> <h|t>
  38.     RETURN <fun(h)|map(t,fun)>
  39.   ENDIF
  40. ENDPROC NIL
  41.  
  42. -> returns a list of elements in l for which fun returns true
  43.  
  44. PROC filter(l,fun)
  45.   DEF h,t,r
  46.   IF l
  47.     l <=> <h|t>
  48.     r:=filter(t,fun)
  49.     RETURN IF fun(h) THEN <h|r> ELSE r
  50.   ENDIF
  51. ENDPROC NIL
  52.  
  53. -> returns two lists of elements in l for which fun returns true and false
  54.  
  55. PROC partition(l,fun)
  56.   DEF h,t,rt,rf
  57.   IF l
  58.     l <=> <h|t>
  59.     rt,rf:=partition(t,fun)
  60.     IF fun(h) THEN RETURN <h|rt>,rf ELSE RETURN rt,<h|rf>
  61.   ENDIF
  62. ENDPROC NIL,NIL
  63.  
  64. -> folds function through list, i.e.:
  65. -> foldr(<1,2,3>,{add},0) = add(1,add(2,add(3,0)))
  66.  
  67. PROC foldr(l,fun,end)
  68.   DEF h,t
  69.   IF l
  70.     l <=> <h|t>
  71.     RETURN fun(h,foldr(t,fun,end))
  72.   ENDIF
  73. ENDPROC end
  74.  
  75. -> zip combines two lists into one list of pairs.
  76.  
  77. PROC zip(x,y)
  78.   DEF a,b,c,d
  79.   IF x
  80.     IF y
  81.       x <=> <a|b>
  82.       y <=> <c|d>
  83.       RETURN <<a|c>|zip(b,d)>
  84.     ENDIF
  85.   ENDIF
  86. ENDPROC NIL
  87.  
  88. -> length of a list
  89.  
  90. PROC length(x) IS IF x THEN length(Cdr(x))+1 ELSE 0
  91.  
  92.  
  93. /*--------universal-cell-printing---------*/
  94.  
  95. /* prints any cell structure in memory, proc(v) is called whenever
  96.    a value is not a cell. below predefined functions for lists/trees
  97.    of ints and strings    */
  98.  
  99. EXPORT PROC showcell(cell,proc)
  100.   DEF a,c
  101.   IF cell
  102.     IF Cell(cell)
  103.       WriteF('<')
  104.       cell <=> <a|c>
  105.       showcell(a,proc)
  106.       IF c
  107.         WHILE Cell(c) AND (c<>0)
  108.           WriteF(',')
  109.           c <=> <a|c>
  110.           showcell(a,proc)
  111.         ENDWHILE
  112.         IF c
  113.           WriteF('|')
  114.           showcell(c,proc)
  115.         ENDIF
  116.         WriteF('>')
  117.       ELSE
  118.         WriteF('>')
  119.       ENDIF
  120.     ELSE
  121.       proc(cell)
  122.     ENDIF
  123.   ELSE
  124.     WriteF('<>')
  125.   ENDIF
  126. ENDPROC
  127.  
  128. PROC showcellint(cell) IS showcell(cell,{showint})
  129. PROC showcellstr(cell) IS showcell(cell,{showstr})
  130.  
  131. PROC showint(x) IS WriteF('\d',x)
  132. PROC showstr(x) IS WriteF('\s',x)
  133.  
  134.