home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #4 / amigaacscoverdisc1998-041998.iso / utilities / shareware / dev / ucb_logoppc / source / makelib < prev    next >
Encoding:
Text File  |  1997-03-07  |  14.6 KB  |  683 lines

  1. mkdir -p logolib
  2. cat << "ENDOFFILE" > logolib/#
  3. to #
  4. op :template.number
  5. end
  6.  
  7. bury "#
  8. ENDOFFILE
  9. cat << "ENDOFFILE" > logolib/\`
  10. to ` :backq.list
  11. if emptyp :backq.list [op []]
  12. if equalp first :backq.list ", ~
  13.    [op fput run first bf :backq.list ` bf bf :backq.list]
  14. if equalp first :backq.list ",@ ~
  15.    [op se run first bf :backq.list ` bf bf :backq.list]
  16. if wordp first :backq.list [op fput first :backq.list ` bf :backq.list]
  17. op fput ` first :backq.list ` bf :backq.list
  18. end
  19.  
  20. bury "`
  21. ENDOFFILE
  22. cat << "ENDOFFILE" > logolib/\?rest
  23. to ?rest [:which 1]
  24. output bf item :which :template.lists
  25. end
  26.  
  27. bury "?rest
  28. ENDOFFILE
  29. cat << "ENDOFFILE" > logolib/arraytolist
  30. to arraytolist :array [:dim count :array] [:limit :dim + first :array]
  31. op cascade :dim [fput item (:limit - #) :array ?] []
  32. end
  33.  
  34. bury "arraytolist
  35. ENDOFFILE
  36. cat << "ENDOFFILE" > logolib/buryall
  37. to buryall
  38. bury contents
  39. end
  40.  
  41. bury "buryall
  42. ENDOFFILE
  43. cat << "ENDOFFILE" > logolib/buryname
  44. to buryname :names
  45. bury namelist :names
  46. end
  47.  
  48. bury "buryname
  49. ENDOFFILE
  50. cat << "ENDOFFILE" > logolib/cascade
  51. to cascade :cascade.limit [:cascade.inputs] 3
  52. if numberp :cascade.limit ~
  53.    [if lessp :cascade.limit 0 ~
  54.        [(throw "error (se [cascade doesn't like] :cascade.limit [as input]))] ~
  55.     make "cascade.limit `[greaterp :template.number ,[int :cascade.limit]]]
  56. local [cascade.templates template.vars cascade.final]
  57. make "cascade.templates []
  58. make "template.vars []
  59. make "cascade.final [?1]
  60. cascade.setup :cascade.inputs
  61. op cascade1 1 :template.vars
  62. end
  63.  
  64. to cascade.setup :inputs
  65. if emptyp :inputs [stop]
  66. if emptyp bf :inputs [make "cascade.final first :inputs stop]
  67. make "cascade.templates lput first :inputs :cascade.templates
  68. make "template.vars lput first bf :inputs :template.vars
  69. cascade.setup bf bf :inputs
  70. end
  71.  
  72. to cascade1 :template.number :template.vars
  73. if apply :cascade.limit :template.vars [op apply :cascade.final :template.vars]
  74. op cascade1 (:template.number+1) (cascade.eval :cascade.templates)
  75. end
  76.  
  77. to cascade.eval :cascade.templates
  78. if emptyp :cascade.templates [op []]
  79. op fput (apply first :cascade.templates :template.vars) ~
  80.         (cascade.eval bf :cascade.templates)
  81. end
  82.  
  83. bury [cascade cascade.setup cascade1 cascade.eval]
  84. ENDOFFILE
  85. cat << "ENDOFFILE" > logolib/cascade.2
  86. to cascade.2 [:cascade2.inputs] 5
  87. op apply "cascade :cascade2.inputs
  88. end
  89.  
  90. bury "cascade.2
  91. ENDOFFILE
  92. cat << "ENDOFFILE" > logolib/closeall
  93. to closeall
  94. foreach allopen [close ?]
  95. end
  96.  
  97. bury "closeall
  98. ENDOFFILE
  99. cat << "ENDOFFILE" > logolib/combine
  100. to combine :this :those
  101. if wordp :those [output word :this :those]
  102. output fput :this :those
  103. end
  104.  
  105. bury "combine
  106. ENDOFFILE
  107. cat << "ENDOFFILE" > logolib/crossmap
  108. to crossmap :cm.template [:cm.lists] 2
  109. if emptyp bf :cm.lists [op cm1 first :cm.lists 1 []]
  110. op cm1 :cm.lists 1 []
  111. end
  112.  
  113. to cm1 :cm.lists :cm.level :template.vars
  114. if emptyp :cm.lists [op (list apply :cm.template :template.vars)]
  115. op cm2 first :cm.lists
  116. end
  117.  
  118. to cm2 :cm.thislist
  119. if emptyp :cm.thislist [op []]
  120. local :cm.level
  121. make :cm.level first :cm.thislist
  122. op se (cm1 bf :cm.lists :cm.level+1 lput first :cm.thislist :template.vars) ~
  123.       (cm2 bf :cm.thislist)
  124. end
  125.  
  126. bury [crossmap cm1 cm2]
  127. ENDOFFILE
  128. cat << "ENDOFFILE" > logolib/dequeue
  129. to dequeue :the.queue.name
  130. local "result
  131. make "result first thing :the.queue.name
  132. make :the.queue.name butfirst thing :the.queue.name
  133. output :result
  134. end
  135.  
  136. bury "dequeue
  137. ENDOFFILE
  138. cat << "ENDOFFILE" > logolib/do.until
  139. .macro do.until :until.instr :until.cond
  140. op se :until.instr (list "until :until.cond :until.instr)
  141. end
  142.  
  143. bury "do.until
  144. ENDOFFILE
  145. cat << "ENDOFFILE" > logolib/do.while
  146. .macro do.while :while.instr :while.cond
  147. op se :while.instr (list "while :while.cond :while.instr)
  148. end
  149.  
  150. bury "do.while
  151. ENDOFFILE
  152. cat << "ENDOFFILE" > logolib/edall
  153. to edall
  154. edit contents
  155. end
  156.  
  157. bury "edall
  158. ENDOFFILE
  159. cat << "ENDOFFILE" > logolib/edn
  160. to edn :names
  161. edit namelist :names
  162. end
  163.  
  164. bury "edn
  165. ENDOFFILE
  166. cat << "ENDOFFILE" > logolib/edns
  167. to edns
  168. edit names
  169. end
  170.  
  171. bury "edns
  172. ENDOFFILE
  173. cat << "ENDOFFILE" > logolib/edpl
  174. to edpl :names
  175. edit pllist :names
  176. end
  177.  
  178. bury "edpl
  179. ENDOFFILE
  180. cat << "ENDOFFILE" > logolib/edpls
  181. to edpls
  182. edit plists
  183. end
  184.  
  185. bury "edpls
  186. ENDOFFILE
  187. cat << "ENDOFFILE" > logolib/edps
  188. to edps
  189. edit procedures
  190. end
  191.  
  192. bury "edps
  193. ENDOFFILE
  194. cat << "ENDOFFILE" > logolib/ern
  195. to ern :names
  196. erase namelist :names
  197. end
  198.  
  199. bury "ern
  200. ENDOFFILE
  201. cat << "ENDOFFILE" > logolib/erpl
  202. to erpl :names
  203. erase pllist :names
  204. end
  205.  
  206. bury "erpl
  207. ENDOFFILE
  208. cat << "ENDOFFILE" > logolib/filep
  209. to filep :filename
  210. ignore error
  211. catch "error [openread :filename close :filename]
  212. output not emptyp error
  213. end
  214.  
  215. bury "filep
  216. ENDOFFILE
  217. cat << "ENDOFFILE" > logolib/file\?
  218. to file? :filename
  219. ignore error
  220. catch "error [openread :filename close :filename]
  221. output not emptyp error
  222. end
  223.  
  224. bury "file?
  225. ENDOFFILE
  226. cat << "ENDOFFILE" > logolib/filter
  227. to filter :filter.template :template.list [:template.number 1] ~
  228.           [:template.lists (list :template.list)]
  229. if emptyp :template.list [op :template.list]
  230. if apply :filter.template (list first :template.list) ~
  231.    [op combine (first :template.list) ~
  232.                (filter :filter.template bf :template.list :template.number+1)]
  233. op (filter :filter.template bf :template.list :template.number+1)
  234. end
  235.  
  236. bury "filter
  237. ENDOFFILE
  238. cat << "ENDOFFILE" > logolib/find
  239. to find :find.template :template.list [:template.number 1] ~
  240.         [:template.lists (list :template.list)]
  241. if emptyp :template.list [op []]
  242. if apply :find.template (list first :template.list) [op first :template.list]
  243. op (find :find.template bf :template.list :template.number+1)
  244. end
  245.  
  246. bury "find
  247. ENDOFFILE
  248. cat << "ENDOFFILE" > logolib/for
  249. .macro for :for.values :for.instr ~
  250.    [:for.var first :for.values] ~
  251.    [:for.initial run first bf :for.values] ~
  252.    [:for.final run first bf bf :for.values] ~
  253.    [:for.step forstep] ~
  254.    [:for.tester (ifelse :for.step < 0 ~
  255.                         [[:for.initial < :for.final]] ~
  256.                         [[:for.initial > :for.final]])]
  257. local :for.var
  258. catch "for.catchtag [op for.done runresult [forloop :for.initial]]
  259. op []
  260. end
  261.  
  262. to forloop :for.initial
  263. make :for.var :for.initial
  264. if run :for.tester [throw "for.catchtag]
  265. run :for.instr
  266. .maybeoutput forloop (:for.initial + :for.step)
  267. end
  268.  
  269. to for.done :for.result
  270. if emptyp :for.result [op [stop]]
  271. op list "output quoted first :for.result
  272. end
  273.  
  274. to forstep
  275. if equalp count :for.values 4 [op run last :for.values]
  276. op ifelse :for.initial > :for.final [-1] [1]
  277. end
  278.  
  279. bury [for forstep forloop for.done]
  280. ENDOFFILE
  281. cat << "ENDOFFILE" > logolib/foreach
  282. .macro foreach [:foreach.inputs] 2
  283. catch "foreach.catchtag ~
  284.       [op foreach.done runresult ~
  285.         [foreach1 bl :foreach.inputs last :foreach.inputs 1]]
  286. op []
  287. end
  288.  
  289. to foreach1 :template.lists :foreach.template :template.number
  290. if emptyp first :template.lists [throw "foreach.catchtag]
  291. apply :foreach.template firsts :template.lists
  292. .maybeoutput foreach1 bfs :template.lists :foreach.template :template.number+1
  293. end
  294.  
  295. to foreach.done :foreach.result
  296. if emptyp :foreach.result [op [stop]]
  297. op list "output quoted first :foreach.result
  298. end
  299.  
  300. bury [foreach foreach1 foreach.done]
  301. ENDOFFILE
  302. cat << "ENDOFFILE" > logolib/gensym
  303. to gensym
  304. if not namep "gensym.number [make "gensym.number 0]
  305. make "gensym.number :gensym.number + 1
  306. output word "g :gensym.number
  307. end
  308.  
  309. bury [[gensym] [gensym.number]]
  310. ENDOFFILE
  311. cat << "ENDOFFILE" > logolib/ignore
  312. to ignore :stuff
  313. end
  314.  
  315. bury "ignore
  316. ENDOFFILE
  317. cat << "ENDOFFILE" > logolib/invoke
  318. to invoke :function [:inputs] 2
  319. .maybeoutput apply :function :inputs
  320. end
  321.  
  322. bury "invoke
  323. ENDOFFILE
  324. cat << "ENDOFFILE" > logolib/iseq
  325. to iseq :a :b
  326. if not (:a > :b) [output iseq1 :a :b]
  327. output map [[x] -1 * :x] iseq1 (-1 * :a) (-1 * :b)
  328. end
  329.  
  330. to iseq1 :a :b
  331. if :a > :b [output []]
  332. output fput :a iseq1 :a + 1 :b
  333. end
  334.  
  335. bury [iseq iseq1]
  336. ENDOFFILE
  337. cat << "ENDOFFILE" > logolib/listtoarray
  338. to listtoarray :list [:origin 1]
  339. local "array
  340. make "array (array count :list :origin)
  341. listtoarray1 :list :origin
  342. output :array
  343. end
  344.  
  345. to listtoarray1 :list :index
  346. if emptyp :list [stop]
  347. setitem :index :array first :list
  348. listtoarray1 bf :list :index+1
  349. end
  350.  
  351. bury [listtoarray listtoarray1]
  352. ENDOFFILE
  353. cat << "ENDOFFILE" > logolib/localmake
  354. .macro localmake :name :value
  355. output (list "local (word "" :name) "apply ""make (list :name :value))
  356. end
  357.  
  358. bury "localmake
  359. ENDOFFILE
  360. cat << "ENDOFFILE" > logolib/macroexpand
  361. to macroexpand :expr
  362. local [name inputlist macro.result]
  363. make "name first :expr
  364. make "inputlist bf :expr
  365. if not macrop :name [(throw "error (se :name [is not a macro.]))]
  366. define "%%%$%macro.procedure text :name
  367. make "macro.result run fput "%%%$%macro.procedure :inputlist
  368. erase "%%%$%macro.procedure
  369. op :macro.result
  370. end
  371.  
  372. bury "macroexpand
  373. ENDOFFILE
  374. cat << "ENDOFFILE" > logolib/map
  375. to map :map.template [:template.lists] 2
  376. op map1 :template.lists 1
  377. end
  378.  
  379. to map1 :template.lists :template.number
  380. if emptyp first :template.lists [output first :template.lists]
  381. output combine (apply :map.template firsts :template.lists) ~
  382.                (map1 bfs :template.lists :template.number+1)
  383. end
  384.  
  385. bury [map map1]
  386. ENDOFFILE
  387. cat << "ENDOFFILE" > logolib/map.se
  388. to map.se :map.se.template [:template.lists] 2
  389. op map.se1 :template.lists 1
  390. end
  391.  
  392. to map.se1 :template.lists :template.number
  393. if emptyp first :template.lists [output []]
  394. output sentence (apply :map.se.template firsts :template.lists) ~
  395.                 (map.se1 bfs :template.lists :template.number+1)
  396. end
  397.  
  398. bury [map.se map.se1]
  399. ENDOFFILE
  400. cat << "ENDOFFILE" > logolib/mdarray
  401. to mdarray :sizes [:origin 1]
  402. local "array
  403. make "array (array first :sizes :origin)
  404. if not emptyp bf :sizes ~
  405.    [for [i :origin [:origin + (first :sizes) - 1]] ~
  406.         [setitem :i :array (mdarray bf :sizes :origin)]]
  407. output :array
  408. end
  409.  
  410. bury "mdarray
  411. ENDOFFILE
  412. cat << "ENDOFFILE" > logolib/mditem
  413. to mditem :index :array
  414. if emptyp :index [op :array]
  415. op mditem bf :index item first :index :array
  416. end
  417.  
  418. bury "mditem
  419. ENDOFFILE
  420. cat << "ENDOFFILE" > logolib/mdsetitem
  421. to mdsetitem :index :array :val
  422. setitem last :index (mditem bl :index :array) :val
  423. end
  424.  
  425. bury "mdsetitem
  426. ENDOFFILE
  427. cat << "ENDOFFILE" > logolib/name
  428. to name :name.value.input :name.variable.input
  429. make :name.variable.input :name.value.input
  430. end
  431.  
  432. bury "name
  433. ENDOFFILE
  434. cat << "ENDOFFILE" > logolib/namelist
  435. to namelist :names
  436. if wordp :names [output list [] (list :names)]
  437. output list [] :names
  438. end
  439.  
  440. bury "namelist
  441. ENDOFFILE
  442. cat << "ENDOFFILE" > logolib/pen
  443. to pen
  444. op (list (ifelse pendownp ["pendown] ["penup]) ~
  445.          penmode pensize pencolor penpattern)
  446. end
  447.  
  448. bury [pen]
  449. ENDOFFILE
  450. cat << "ENDOFFILE" > logolib/pick
  451. to pick :list
  452. output item (1+random count :list) :list
  453. end
  454.  
  455. bury "pick
  456. ENDOFFILE
  457. cat << "ENDOFFILE" > logolib/pllist
  458. to pllist :names
  459. if wordp :names [output (list [] [] (list :names))]
  460. output (list [] [] :names)
  461. end
  462.  
  463. bury "pllist
  464. ENDOFFILE
  465. cat << "ENDOFFILE" > logolib/poall
  466. to poall
  467. po contents
  468. end
  469.  
  470. bury "poall
  471. ENDOFFILE
  472. cat << "ENDOFFILE" > logolib/pon
  473. to pon :names
  474. ignore error
  475. catch "error [po namelist :names]
  476. local "err
  477. make "err error
  478. if not emptyp :err [(throw "error first bf :err)]
  479. end
  480.  
  481. bury "pon
  482. ENDOFFILE
  483. cat << "ENDOFFILE" > logolib/pons
  484. to pons
  485. po names
  486. end
  487.  
  488. bury "pons
  489. ENDOFFILE
  490. cat << "ENDOFFILE" > logolib/pop
  491. to pop :the.stack.name
  492. local "result
  493. make "result first thing :the.stack.name
  494. make :the.stack.name butfirst thing :the.stack.name
  495. output :result
  496. end
  497.  
  498. bury "pop
  499. ENDOFFILE
  500. cat << "ENDOFFILE" > logolib/popl
  501. to popl :names
  502. ignore error
  503. catch "error [po pllist :names]
  504. local "err
  505. make "err error
  506. if not emptyp :err [(throw "error first bf :err)]
  507. end
  508.  
  509. bury "popl
  510. ENDOFFILE
  511. cat << "ENDOFFILE" > logolib/popls
  512. to popls
  513. po plists
  514. end
  515.  
  516. bury "popls
  517. ENDOFFILE
  518. cat << "ENDOFFILE" > logolib/pops
  519. to pops
  520. po procedures
  521. end
  522.  
  523. bury "pops
  524. ENDOFFILE
  525. cat << "ENDOFFILE" > logolib/pots
  526. to pots
  527. pot procedures
  528. end
  529.  
  530. bury "pots
  531. ENDOFFILE
  532. cat << "ENDOFFILE" > logolib/push
  533. to push :the.stack.name :the.item.value
  534. make :the.stack.name fput :the.item.value thing :the.stack.name
  535. end
  536.  
  537. bury "push
  538. ENDOFFILE
  539. cat << "ENDOFFILE" > logolib/queue
  540. to queue :the.queue.name :the.item.value
  541. make :the.queue.name lput :the.item.value thing :the.queue.name
  542. end
  543.  
  544. bury "queue
  545. ENDOFFILE
  546. cat << "ENDOFFILE" > logolib/quoted
  547. to quoted :stuff
  548. if wordp :stuff [op word "" :stuff]
  549. op :stuff
  550. end
  551.  
  552. bury "quoted
  553. ENDOFFILE
  554. cat << "ENDOFFILE" > logolib/reduce
  555. to reduce :reduce.function :reduce.list
  556. if emptyp bf :reduce.list [op first :reduce.list]
  557. op apply :reduce.function (list (first :reduce.list) ~
  558.                                 (reduce :reduce.function bf :reduce.list))
  559. end
  560.  
  561. bury "reduce
  562. ENDOFFILE
  563. cat << "ENDOFFILE" > logolib/remdup
  564. to remdup :list
  565. output filter [not memberp ? ?rest] :list
  566. end
  567.  
  568. bury "remdup
  569. ENDOFFILE
  570. cat << "ENDOFFILE" > logolib/remove
  571. to remove :thing :list
  572. output filter [not equalp ? :thing] :list
  573. end
  574.  
  575. bury "remove
  576. ENDOFFILE
  577. cat << "ENDOFFILE" > logolib/reverse
  578. to reverse :in [:out ifelse listp :in [[]] ["]]
  579. if emptyp :in [output :out]
  580. output (reverse bf :in combine first :in :out)
  581. end
  582.  
  583. bury "reverse
  584. ENDOFFILE
  585. cat << "ENDOFFILE" > logolib/rseq
  586. to rseq :a :b :n
  587. output map [[x] :a + :x * (:b - :a) / (:n - 1)] iseq 0 :n - 1
  588. end
  589.  
  590. bury "rseq
  591. ENDOFFILE
  592. cat << "ENDOFFILE" > logolib/savel
  593. to savel :cont :file [:oldwr writer]
  594. openwrite :file
  595. setwrite :file
  596. po :cont
  597. setwrite :oldwr
  598. close :file
  599. end
  600.  
  601. bury "savel
  602. ENDOFFILE
  603. cat << "ENDOFFILE" > logolib/setpen
  604. to setpen :pen_data
  605. ifelse equalp first :pen_data "penup [penup] [pendown]
  606. ifelse equalp first bf :pen_data "reverse ~
  607.        [penreverse] ~
  608.        [ifelse equalp first bf :pen_data "erase ~
  609.                [penerase] ~
  610.                [penpaint]]
  611. setpensize first bf bf :pen_data
  612. setpencolor first bf bf bf :pen_data
  613. setpenpattern first bf bf bf bf :pen_data
  614. end
  615.  
  616. bury [setpen]
  617. ENDOFFILE
  618. cat << "ENDOFFILE" > logolib/transfer
  619. to transfer :transfer.limit :transfer.template :transfer.init
  620. output cascade.2 (ifelse emptyp :transfer.limit ~
  621.                          [[emptyp ?2]] ~
  622.                          [list "transfer.end.test :transfer.limit]) ~
  623.                  :transfer.template [] [butfirst ?2] :transfer.init
  624. end
  625.  
  626. to transfer.end.test :the.condition.expression
  627. if emptyp ?2 [output "true]
  628. output run :the.condition.expression
  629. end
  630.  
  631. to ?in
  632. output first ?2
  633. end
  634.  
  635. to ?out
  636. output ?1
  637. end
  638.  
  639. bury [transfer transfer.end.test ?in ?out]
  640. ENDOFFILE
  641. cat << "ENDOFFILE" > logolib/unburyall
  642. to unburyall
  643. unbury buried
  644. end
  645. ENDOFFILE
  646. cat << "ENDOFFILE" > logolib/unburyname
  647. to unburyname :names
  648. unbury namelist :names
  649. end
  650.  
  651. bury "unburyname
  652. ENDOFFILE
  653. cat << "ENDOFFILE" > logolib/until
  654. .macro until :until.cond :until.instr
  655. if run :until.cond [op []]
  656. op se :until.instr (list "until :until.cond :until.instr)
  657. end
  658.  
  659. bury "until
  660. ENDOFFILE
  661. cat << "ENDOFFILE" > logolib/while
  662. .macro while :while.cond :while.instr
  663. if not run :while.cond [op []]
  664. op se :while.instr (list "while :while.cond :while.instr)
  665. end
  666.  
  667. bury "while
  668. ENDOFFILE
  669. cat << "ENDOFFILE" > logolib/xcor
  670. to xcor
  671. output first pos
  672. end
  673.  
  674. bury "xcor
  675. ENDOFFILE
  676. cat << "ENDOFFILE" > logolib/ycor
  677. to ycor
  678. output last pos
  679. end
  680.  
  681. bury "ycor
  682. ENDOFFILE
  683.