home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / historic / v941.tgz / icon.v941src.tar / icon.v941src / ipl / packs / skeem / sklist.icn < prev    next >
Text File  |  2000-07-29  |  4KB  |  253 lines

  1. ############################################################################
  2. #
  3. #    Name:    sklist.icn
  4. #
  5. #    Title:    Scheme in Icon
  6. #
  7. #    Author: Bob Alexander
  8. #
  9. #    Date:    March 23, 1995
  10. #
  11. #    Description: see skeem.icn
  12. #
  13. ############################################################################
  14.  
  15. #
  16. # skeem -- Scheme in Icon
  17. #
  18. # List and vector procedures
  19. #
  20.  
  21. #
  22. # Initialize
  23. #
  24. # List entries are described in skfun.icn.
  25. #
  26. procedure InitList()
  27.    DefFunction([
  28.       APPEND,&null,
  29.       ASSOC,2,
  30.       ASSQ,2,
  31.       ASSV,2,
  32.       CAR,
  33.       CDR,
  34.       CONS,2,
  35.       CXXR,"CAAR",
  36.       CXXR,"CADR",
  37.       CXXR,"CDAR",
  38.       CXXR,"CDDR",
  39.       CXXR,"CAAAR",
  40.       CXXR,"CAADR",
  41.       CXXR,"CADAR",
  42.       CXXR,"CADDR",
  43.       CXXR,"CDAAR",
  44.       CXXR,"CDADR",
  45.       CXXR,"CDDAR",
  46.       CXXR,"CDDDR",
  47.       CXXR,"CAAAAR",
  48.       CXXR,"CAAADR",
  49.       CXXR,"CAADAR",
  50.       CXXR,"CAADDR",
  51.       CXXR,"CADAAR",
  52.       CXXR,"CADADR",
  53.       CXXR,"CADDAR",
  54.       CXXR,"CADDDR",
  55.       CXXR,"CDAAAR",
  56.       CXXR,"CDAADR",
  57.       CXXR,"CDADAR",
  58.       CXXR,"CDADDR",
  59.       CXXR,"CDDAAR",
  60.       CXXR,"CDDADR",
  61.       CXXR,"CDDDAR",
  62.       CXXR,"CDDDDR",
  63.       LENGTH,
  64.       LIST,&null,
  65.       LIST_2_VECTOR,
  66.       LIST_P,
  67.       LIST_REF,2,
  68.       LIST_TAIL,2,
  69.       MAKE_VECTOR,1,2,
  70.       MEMBER,2,
  71.       MEMQ,2,
  72.       MEMV,2,
  73.       NULL_P,
  74.       PAIR_P,
  75.       REVERSE,
  76.       SET_CAR_BANG,2,
  77.       SET_CDR_BANG,2,
  78.       VECTOR,&null,
  79.       VECTOR_2_LIST,
  80.       VECTOR_FILL_BANG,2,
  81.       VECTOR_LENGTH,
  82.       VECTOR_P,
  83.       VECTOR_REF,2,
  84.       VECTOR_SET_BANG,3])
  85.    return
  86. end
  87.  
  88.  
  89. #
  90. # Pairs and lists.
  91. #
  92.  
  93. procedure PAIR_P(x)
  94.    return (LLIsPair(x),T) | F
  95. end
  96.  
  97. procedure CONS(first,rest)
  98.    return LLPair(first,rest)
  99. end
  100.  
  101. procedure CAR(pair)
  102.    return LLFirst(pair)
  103. end
  104.  
  105. procedure CDR(pair)
  106.    return LLRest(pair)
  107. end
  108.  
  109. procedure SET_CAR_BANG(pair,value)
  110.    return LLFirst(pair) := value
  111. end
  112.  
  113. procedure SET_CDR_BANG(pair,value)
  114.    return LLRest(pair) := value
  115. end
  116.  
  117. ## procedure ArgErr(fName,argList,msg,argNbr)
  118. ##    /argNbr := 1
  119. ##    return Error(fName,"bad argument ",argNbr,": ",
  120. ##     Print(LLElement(argList,argNbr))," -- " || \msg | "")
  121. ## end
  122.  
  123. procedure CXXR(lst)
  124.    local result,c
  125.    result := lst
  126.    every c := !reverse(FuncName[2:-1]) do {
  127.       result := (if c == "A" then LLFirst else LLRest)(result)
  128.       }
  129.    return result
  130. end
  131.  
  132. procedure NULL_P(x)
  133.    return (LLIsNull(x),T) | F
  134. end
  135.  
  136. procedure LIST_P(x)
  137.    local beenThere
  138.    beenThere := set()
  139.    while LLIsPair(x) do {
  140.       if member(beenThere,x) then break
  141.       insert(beenThere,x)
  142.       x := LLRest(x)
  143.       }
  144.    return (LLIsNull(x),T) | F
  145. end
  146.  
  147. procedure LIST(x[])
  148.    return LList!x
  149. end
  150.  
  151. procedure LENGTH(lst)
  152.    return LLLength(lst)
  153. end
  154.  
  155. procedure APPEND(lst[])
  156.    return LLAppend!lst
  157. end
  158.  
  159. procedure REVERSE(lst)
  160.    return LLReverse(lst)
  161. end
  162.  
  163. procedure LIST_TAIL(lst,i)
  164.    return LLTail(lst,i + 1)
  165. end
  166.  
  167. procedure LIST_REF(lst,i)
  168.    return LLElement(lst,i + 1)
  169. end
  170.  
  171. invocable "===":2
  172.  
  173. procedure MEMQ(lst,x)
  174.    static eq
  175.    initial eq := proc("===",2)
  176.    return Member(eq,lst,x) | F
  177. end
  178.  
  179. procedure MEMV(lst,x)
  180.    return Member(Eqv,lst,x) | F
  181. end
  182.  
  183. procedure MEMBER(lst,x)
  184.    return Member(Equal,lst,x) | F
  185. end
  186.  
  187. procedure Member(test,obj,L)
  188.    return if /L then fail else (test(obj,LLFirst(L)),L) | Member(test,obj,LLRest(L))
  189. end
  190.  
  191. invocable "===":2
  192.  
  193. procedure ASSQ(alst,x)
  194.    static eq
  195.    initial eq := proc("===",2)
  196.    return Assoc(eq,alst,x) | F
  197. end
  198.  
  199. procedure ASSV(alst,x)
  200.    return Assoc(Eqv,alst,x) | F
  201. end
  202.  
  203. procedure ASSOC(alst,x)
  204.    return Assoc(Equal,alst,x) | F
  205. end
  206.  
  207. procedure Assoc(test,obj,L)
  208.    return if /L then fail else (test(obj,LLFirst(LLFirst(L))),LLFirst(L)) |
  209.      Assoc(test,obj,LLRest(L))
  210. end
  211.  
  212.  
  213. #
  214. # Vectors
  215. #
  216.  
  217. procedure VECTOR_P(x)
  218.    return (VectorP(x),T) | F
  219. end
  220.  
  221. procedure MAKE_VECTOR(len,value[])
  222.    return list(len,value[1] | F)
  223. end
  224.  
  225. procedure VECTOR(x[])
  226.    return x
  227. end
  228.  
  229. procedure VECTOR_LENGTH(vec)
  230.    return *vec
  231. end
  232.  
  233. procedure VECTOR_REF(vec,i)
  234.    return vec[i + 1]
  235. end
  236.  
  237. procedure VECTOR_SET_BANG(vec,i,value)
  238.    return vec[i + 1] := value
  239. end
  240.  
  241. procedure VECTOR_2_LIST(vec)
  242.    return LList!vec
  243. end
  244.  
  245. procedure LIST_2_VECTOR(lst)
  246.    return LLToList(lst)
  247. end
  248.  
  249. procedure VECTOR_FILL_BANG(vec,value)
  250.    every !vec := value
  251.    return vec
  252. end
  253.