vslcompat.lsp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892
  1. % This is a collection of commonly useful Lisp
  2. % functions that can be defined in terms of the
  3. % things that are built into vsl. The idea is that
  4. % going
  5. % ./vsl -z library.lsp
  6. % will create an image file vsl.img that can be loaded
  7. % next time vsl is started, so that the cold-start
  8. % flag (-z) does not then have to be used and all these
  9. % extra functions will be available.
  10. % Because this uses (preserve) this will only work on full vsl
  11. % not minivsl.
  12. (setq blank '! )
  13. (setq tab (code!-char 9))
  14. (setq !$eol!$ (code!-char 10))
  15. (setq dollar '!$)
  16. (setq lpar '!()
  17. (setq rpar '!))
  18. (setq f nil)
  19. (de caar (x) % Shorthands for combinations of car/cdr.
  20. (car (car x)))
  21. (de cadr (x)
  22. (car (cdr x)))
  23. (de cdar (x)
  24. (cdr (car x)))
  25. (de cddr (x)
  26. (cdr (cdr x)))
  27. (de caaar (x)
  28. (car (car (car x))))
  29. (de caadr (x)
  30. (car (car (cdr x))))
  31. (de cadar (x)
  32. (car (cdr (car x))))
  33. (de caddr (x)
  34. (car (cdr (cdr x))))
  35. (de cdaar (x)
  36. (cdr (car (car x))))
  37. (de cdadr (x)
  38. (cdr (car (cdr x))))
  39. (de cddar (x)
  40. (cdr (cdr (car x))))
  41. (de cdddr (x)
  42. (cdr (cdr (cdr x))))
  43. (de caaaar (x)
  44. (car (car (car (car x)))))
  45. (de caaadr (x)
  46. (car (car (car (cdr x)))))
  47. (de caadar (x)
  48. (car (car (cdr (car x)))))
  49. (de caaddr (x)
  50. (car (car (cdr (cdr x)))))
  51. (de cadaar (x)
  52. (car (cdr (car (car x)))))
  53. (de cadadr (x)
  54. (car (cdr (car (cdr x)))))
  55. (de caddar (x)
  56. (car (cdr (cdr (car x)))))
  57. (de cadddr (x)
  58. (car (cdr (cdr (cdr x)))))
  59. (de cdaaar (x)
  60. (cdr (car (car (car x)))))
  61. (de cdaadr (x)
  62. (cdr (car (car (cdr x)))))
  63. (de cdadar (x)
  64. (cdr (car (cdr (car x)))))
  65. (de cdaddr (x)
  66. (cdr (car (cdr (cdr x)))))
  67. (de cddaar (x)
  68. (cdr (cdr (car (car x)))))
  69. (de cddadr (x)
  70. (cdr (cdr (car (cdr x)))))
  71. (de cdddar (x)
  72. (cdr (cdr (cdr (car x)))))
  73. (de cddddr (x)
  74. (cdr (cdr (cdr (cdr x)))))
  75. (de not (x)
  76. (null x))
  77. (de idp (x)
  78. (symbolp x))
  79. (de pairp (x)
  80. (null (atom x)))
  81. (de reverse (x)
  82. (prog (y)
  83. loop
  84. (cond ((null x) (return y)))
  85. (setq y (cons (car x) y))
  86. (setq x (cdr x))
  87. (go loop)))
  88. (de reversip_sub (a b)
  89. (prog (w)
  90. loop
  91. (cond ((null a) (return b)))
  92. (setq w (cdr a))
  93. (rplacd a b)
  94. (setq b a)
  95. (setq a w)
  96. (go loop)))
  97. (de reversip (x) (reversip_sub x nil)) % Destructive reverse
  98. (de append (a b) % Append a pair of lists.
  99. (cond
  100. ((null a) b)
  101. (t (cons (car a) (append (cdr a) b)))))
  102. % I have written various of these in ugly imperative styles so that they
  103. % end up iterative not recusrive...
  104. (de length (l) % Find length of a list.
  105. (prog (n)
  106. (setq n 0)
  107. top(cond ((atom l) (return n)))
  108. (setq n (add1 n))
  109. (setq l (cdr l))
  110. (go top)))
  111. (de last (l) % Last element of a (non-empty) list.
  112. (prog ()
  113. (cond
  114. ((null l) (error 1 "last on emtpy list")))
  115. top(cond
  116. ((atom (cdr l)) (return l)))
  117. (setq l (cdr l))
  118. (go top)))
  119. (de lastcar (l) % Not in Standard Lisp
  120. (prog ()
  121. (cond
  122. ((null l) (error 1 "lastcar on emtpy list")))
  123. top(cond
  124. ((atom (cdr l)) (return (car l))))
  125. (setq l (cdr l))
  126. (go top)))
  127. (de lastpair (l) % Last pair of a (non-empty) list.
  128. (prog ()
  129. (cond
  130. ((null l) (error 1 "lastpair on emtpy list")))
  131. top(cond
  132. ((atom (cdr l)) (return l)))
  133. (setq l (cdr l))
  134. (go top)))
  135. (de member (a l)
  136. (prog ()
  137. top
  138. (cond
  139. ((null l) (return nil))
  140. ((equal a (car l)) (return l)))
  141. (setq l (cdr l))
  142. (go top)))
  143. (de memq (a l)
  144. (prog ()
  145. top
  146. (cond
  147. ((null l) (return nil))
  148. ((eq a (car l)) (return l)))
  149. (setq l (cdr l))
  150. (go top)))
  151. (de delete (a l)
  152. (cond
  153. ((null l) nil)
  154. ((equal a (car l)) (cdr l))
  155. (t (cons (car l) (delete a (cdr l))))))
  156. (de intersection (a b)
  157. (cond
  158. ((null a) nil)
  159. ((member (car a) b) (cons (car a) (intersection (cdr a) b)))
  160. (t (intersection (cdr a) b))))
  161. (de union (a b)
  162. (cond
  163. ((null a) b)
  164. ((member (car a) b) (union (cdr a) b))
  165. (t (cons (car a) (union (cdr a) b)))))
  166. (de neq (a b) % Not equal.
  167. (null (equal a b)))
  168. (de eqcar (a b) % Is (car a) the same as b?
  169. (and (not (atom a)) (eq (car a) b)))
  170. (de assoc (a l) % Look item up in association list.
  171. (cond
  172. ((null l) nil)
  173. ((and (not (atom (car l)))
  174. (equal (caar l) a)) (car l))
  175. (t (assoc a (cdr l)))))
  176. (de atsoc (a l) % Look item up in association list.
  177. (cond
  178. ((null l) nil)
  179. ((and (not (atom (car l)))
  180. (eq (caar l) a)) (car l))
  181. (t (atsoc a (cdr l)))))
  182. (de subst (a b c) % Substitute a for b in c
  183. (cond
  184. ((equal b c) a)
  185. ((atom c) c)
  186. (t (cons (subst a b (car c)) (subst a b (cdr c))))))
  187. (de sublis (x y)
  188. (if (null x) y
  189. (prog (u)
  190. (setq u (assoc y x))
  191. (return (cond
  192. ((not (atom u)) (cdr u))
  193. ((atom y) y)
  194. (t (cons (sublis x (car y))
  195. (sublis x (cdr y)))))))))
  196. (de subla (x y)
  197. (if (null x) y
  198. (prog (u)
  199. (setq u (atsoc y x))
  200. (return (cond
  201. ((not (atom u)) (cdr u))
  202. ((atom y) y)
  203. (t (cons (subla x (car y))
  204. (subla x (cdr y)))))))))
  205. (de pair (u v)
  206. (cond
  207. ((or (atom u) (atom v)) nil)
  208. (t (cons (cons (car u) (car v)) (pair (cdr u) (cdr v))))))
  209. (de spaces (n) % Print n blanks.
  210. (cond
  211. ((zerop n) nil)
  212. (t (princ " ") (spaces (sub1 n)))))
  213. (de prettyprint (x) % Display something with indentation.
  214. (terpri)
  215. (pprint x 0)
  216. (terpri)
  217. nil)
  218. (de pprint (x n) % Sub-function for prettyprint.
  219. (cond
  220. ((or (atom x)
  221. (lessp (length (explode x)) 40)) (prin x))
  222. (t (princ "(")
  223. (pprint (car x) (add1 n))
  224. (pprintail (cdr x) (plus n 3)))))
  225. (de pprintail (x n) % Sub-function for prettyprint.
  226. (cond
  227. ((null x) (princ ")"))
  228. ((atom x) (princ " . ")
  229. (prin x)
  230. (princ ")"))
  231. (t (terpri)
  232. (spaces n)
  233. (pprint (car x) n)
  234. (pprintail (cdr x) n))))
  235. (de rplacw (a b) (progn (rplaca a (car b)) (rplacd a (cdr b))))
  236. (de expand (l fn)
  237. (cond
  238. ((null (cdr l)) (car l))
  239. (t (list fn (car l) (expand (cdr l) fn)))))
  240. (de mapcar (l fn)
  241. (prog (r)
  242. top (cond ((null l) (return (reversip r))))
  243. (setq r (cons (apply fn (list (car l))) r))
  244. (setq l (cdr l))
  245. (go top)))
  246. (de maplist (l fn)
  247. (prog (r)
  248. top (cond ((null l) (return (reversip r))))
  249. (setq r (cons (apply fn (list l)) r))
  250. (setq l (cdr l))
  251. (go top)))
  252. (de mapcan (l fn)
  253. (cond ((null l) nil)
  254. (t (nconc (apply fn (list (car l))) (mapcan (cdr l) fn)))))
  255. (de mapcon (l fn)
  256. (cond ((null l) nil)
  257. (t (nconc (apply fn (list l)) (mapcon (cdr l) fn)))))
  258. (de mapc (l fn)
  259. (prog ()
  260. top (cond ((null l) (return nil)))
  261. (apply fn (list (car l)))
  262. (setq l (cdr l))
  263. (go top)))
  264. (de map (l fn)
  265. (prog ()
  266. top (cond ((null l) (return nil)))
  267. (apply fn (list l))
  268. (setq l (cdr l))
  269. (go top)))
  270. (de copy (a)
  271. (cond
  272. ((atom a) a)
  273. (t (cons (copy (car a)) (copy (cdr a))))))
  274. (de sassoc (a l fn)
  275. (cond
  276. ((atom l) (apply fn nil))
  277. ((equal a (caar l)) (car l))
  278. (t (sassoc a (cdr l) fn))))
  279. (de rassoc (x l) % Not in Standard Lisp
  280. (prog ()
  281. loop (cond ((atom l) (return nil))
  282. ((equal x (cdar l)) (return (car l)))
  283. (t (setq l (cdr l)) (go loop))) ))
  284. (de deflist (a b)
  285. (prog (r)
  286. top (cond ((null a) (return (reversip r))))
  287. (put (caar a) b (cadar a))
  288. (setq r (cons (caar a) r))
  289. (setq a (cdr a))
  290. (go top)))
  291. (de expand_backquote (x)
  292. (cond
  293. ((and (symbolp x) (null (null x))) (list 'quote x))
  294. ((atom x) x) % nil, number or string
  295. ((eq (car x) '!,) (cadr x))
  296. ((eqcar (car x) '!,!@)
  297. (list 'append (cadar x) (expand_backquote (cdr x))))
  298. (t (list 'cons (expand_backquote (car x)) (expand_backquote (cdr x))))))
  299. (dm !` (x) (expand_backquote (cadr x)))
  300. (de macroexpand_cond (l)
  301. (cond
  302. ((null l) nil)
  303. (t (cons (macroexpand_list (car l))
  304. (macroexpand_cond (cdr l))))))
  305. (de macroexpand (x)
  306. (cond
  307. ((atom x) x)
  308. ((not (atom (car x)))
  309. (cons (macroexpand (car x))
  310. (macroexpand_list (cdr x))))
  311. ((eqcar x 'quote) x)
  312. ((eqcar x 'cond)
  313. (cons 'cond (macroexpand_cond (cdr x))))
  314. ((or (eqcar x 'prog) (eqcar x 'lambda))
  315. (cons (car x) (cons (cadr x)
  316. (macroexpand_list (cddr x)))))
  317. ((eqcar (getd (car x)) 'macro)
  318. (macroexpand (apply (cdr (getd (car x)))
  319. (list x))))
  320. (t (cons (car x) (macroexpand_list (cdr x))))))
  321. (de macroexpand_list (l)
  322. (cond
  323. ((null l) nil)
  324. (t (cons (macroexpand (car l))
  325. (macroexpand_list (cdr l))))))
  326. % Now a few things not needed by Standard Lisp but maybe helpful
  327. % when using Lisp directly.
  328. (dm !~let (x) % (!~let ((v1 E1) (v2 E2) ...) body)
  329. (cons (cons 'lambda (cons (mapcar (cadr x) 'car) (cddr x)))
  330. (mapcar (cadr x) 'cadr)))
  331. (de expand_let!* (b x)
  332. (cond
  333. ((null b) x)
  334. (t (list (list 'lambda (list (caar b)) (expand_let!* (cdr b) x))
  335. (cadar b)))))
  336. (dm let!* (x) % As !~let, but do bindings sequentially
  337. (expand_let!* (cadr x) (cons 'progn (cddr x))))
  338. (dm if (x) % (IF predicate yes no)
  339. `(cond
  340. (,(cadr x) ,(caddr x))
  341. (t ,(cond ((atom (cdddr x)) nil) (t (car (cdddr x)))))))
  342. (dm when (x) % (WHEN predicate yes yes yes ...)
  343. `(cond
  344. (,(cadr x) ,@(cddr x))))
  345. (dm while (x) % (WHILE predicate body body body ...)
  346. (!~let ((g (gensym)))
  347. `(prog nil
  348. ,g (cond ((null ,(cadr x)) (return nil)))
  349. ,@(cddr x)
  350. (go ,g)))))
  351. (de make_psetq_vars (u)
  352. (if (null u)
  353. nil
  354. (if (null (cdr u))
  355. (error "odd number of items in psetq")
  356. (cons (gensym) (make_psetq_vars (cddr u))))))
  357. (de make_psetq_bindings (vars u)
  358. (if (null u)
  359. nil
  360. (cons
  361. (list (car vars) (cadr u))
  362. (make_psetq_bindings (cdr vars) (cddr u)))))
  363. (de make_psetq_assignments (vars u)
  364. (if (null u)
  365. nil
  366. (cons
  367. (list 'setq (car u) (car vars))
  368. (make_psetq_assignments (cdr vars) (cddr u)))))
  369. (dm psetq (x) % parallel setq as in (psetq x X y Y z Z)
  370. (!~let ((vars (make_psetq_vars (cdr x))))
  371. `(let!* ,(make_psetq_bindings vars (cdr x))
  372. ,@(make_psetq_assignments vars (cdr x)))))
  373. % (do ((var init step) ..)
  374. % (endcondition result ...)
  375. % body)
  376. (de do_bindings (u)
  377. (if (null u)
  378. nil
  379. (if (atom (car u))
  380. (cons (car u) (do_bindings (cdr u)))
  381. (if (null (cdar u))
  382. (cons (list (caar u) nil) (do_bindings (cdr u)))
  383. (cons (list (caar u) (cadar u)) (do_bindings (cdr u)))))))
  384. (de do_endtest (u)
  385. (if (null u)
  386. nil
  387. (car u)))
  388. (de do_result (u)
  389. (if (null u)
  390. nil
  391. (cdr u)))
  392. (de do_updates (u)
  393. (if (null u)
  394. nil
  395. (!~let ((v (car u))
  396. (x (do_updates (cdr u))))
  397. (if (or (atom v)
  398. (null (cdr v))
  399. (null (cddr v)))
  400. x
  401. (cons (car v) (cons (caddr v) x))))))
  402. (de expand_do (u letter setter)
  403. (let!* ((bindings (do_bindings (car u)))
  404. (result (do_result (cadr u)))
  405. (updates (do_updates (car u)))
  406. (body (cddr u))
  407. (endtest (do_endtest (cadr u)))
  408. (upd (if updates (list (cons setter updates)) nil))
  409. (res (if (null result)
  410. nil
  411. (if (null (cdr result))
  412. (car result)
  413. (cons 'progn result))))
  414. (x (if (null endtest) nil
  415. `((when ,endtest (return ,res)))))
  416. (g (gensym)))
  417. (if bindings
  418. `(,letter ,bindings
  419. (prog nil
  420. ,g ,@x
  421. ,@body
  422. ,@upd
  423. (go ,g)))
  424. `(prog nil
  425. ,g ,@x
  426. ,@body
  427. ,@upd
  428. (go ,g)))))
  429. (dm do (u) (expand_do (cdr u) '!~let 'psetq))
  430. (dm do!* (u) (expand_do (cdr u) 'let!* 'setq))
  431. (de expand_dolist (vir b)
  432. (prog (l v var init res)
  433. (setq var (car vir))
  434. (setq init (car (setq vir (cdr vir))))
  435. (setq res (cdr vir))
  436. (setq v (gensym))
  437. (setq l (gensym))
  438. (return `(prog (,v ,var)
  439. (setq ,v ,init)
  440. ,l (cond ((null ,v) (return (progn ,@res))))
  441. (setq ,var (car ,v))
  442. ,@b
  443. (setq ,v (cdr ,v))
  444. (go ,l)))))
  445. (dm dolist (u) (expand_dolist (cadr u) (cddr u)))
  446. (de expand_dotimes (vnr b)
  447. (prog (l v var count res)
  448. (setq var (car vnr))
  449. (setq count (car (setq vnr (cdr vnr))))
  450. (setq res (cdr vnr))
  451. (setq v (gensym))
  452. (setq l (gensym))
  453. (return `(prog (,v ,var)
  454. (setq ,v ,count)
  455. (setq ,var 0)
  456. ,l (cond ((geq ,var ,v) (return (progn ,@res))))
  457. ,@b
  458. (setq ,var (add1 ,var))
  459. (go ,l)))))
  460. (dm dotimes (u) (expand_dotimes (cadr u) (cddr u)))
  461. (de nconc (u v)
  462. (if (atom u) v
  463. (!~let ((w u))
  464. (while (not (atom (cdr u))) (setq u (cdr u)))
  465. (rplacd u v)
  466. w)))
  467. % Up to here this is as in library.lsp
  468. (de ensure_defined (v)
  469. (when (atom (errorset v nil nil))
  470. (eval (list 'setq v nil))))
  471. (de fluid (x)
  472. (remflag x 'global)
  473. (flag x 'fluid)
  474. (dolist (v x) (ensure_defined v)))
  475. (de global (x)
  476. (remflag x 'fluid)
  477. (flag x 'global)
  478. (dolist (v x) (ensure_defined v)))
  479. (de fluidp (x) (flagp x 'fluid))
  480. (de globalp (x) (flagp x 'global))
  481. (de flag (l tag)
  482. (dolist (v l) (put v tag t)))
  483. (de remflag (l tag)
  484. (dolist (v l) (remprop v tag)))
  485. (de flagp (v tag) (get v tag))
  486. (de prin2 (x) (princ x))
  487. (de explode2 (x) (explodec x))
  488. (de liter (x)
  489. (!~let ((c (char!-code x)))
  490. (or (and (leq 65 c) (leq c 90))
  491. (and (leq 97 c) (leq c 122)))))
  492. (de digit (x)
  493. (!~let ((c (char!-code x)))
  494. (and (leq 48 c) (leq c 57))))
  495. (de intern (x) x)
  496. (de mapobl (f)
  497. % Apply F to every interned ID
  498. (mapc (oblist f))
  499. (setq !*raise nil)
  500. (setq !*lower t)
  501. (de putd (name type def)
  502. (cond
  503. ((eq type 'expr)
  504. (eval (cons 'de (cons name (cdr def)))))
  505. ((eq type 'macro)
  506. (eval (cons 'dm (cons name (cdr def)))))
  507. (t (error "unknown type in putd" type))))
  508. (de date () "1 Feb 2012")
  509. (de mkquote (x) (list 'quote x))
  510. (de apply1 (fn a1) (apply fn (list a1)))
  511. (de apply2 (fn a1 a2) (apply fn (list a1 a2)))
  512. (de apply3 (fn a1 a2 a3) (apply fn (list a1 a2 a3)))
  513. (de special!-char (n)
  514. (cond
  515. ((equal n 0) (code!-char 32))
  516. ((equal n 1) (code!-char 10))
  517. ((equal n 2) (code!-char 8))
  518. ((equal n 3) (code!-char 9))
  519. ((equal n 4) (code!-char 11))
  520. ((equal n 5) (code!-char 12))
  521. ((equal n 6) (code!-char 13))
  522. ((equal n 7) (code!-char 127))
  523. ((equal n 8) !$eof!$)
  524. ((equal n 9) (code!-char 7))
  525. ((equal n 10) (code!-char 27))
  526. (t (error "special-char" n))))
  527. (de expt (a n)
  528. (cond
  529. ((zerop n) 1)
  530. ((onep n) a)
  531. ((minusp n) (expt (quotient 1.0 a) (minus n)))
  532. ((zerop (remainder n 2)) (expt (times a a) (quotient n 2)))
  533. (t (times a (expt (times a a) (quotient (sub1 n) 2))))))
  534. (setq small!-modulus 3)
  535. (de set!-small!-modulus (n)
  536. (!~let ((r small!-modulus))
  537. (setq small!-modulus n)
  538. r))
  539. (de small!-modular!-number (n)
  540. (setq n (remainder n small!-modulus))
  541. (when (minusp n) (setq n (plus n small!-modulus)))
  542. n)
  543. (de small!-modular!-plus (a b)
  544. (small!-modular!-number (plus a b)))
  545. (de small!-modular!-difference (a b)
  546. (small!-modular!-number (difference a b)))
  547. (de small!-modular!-times (a b)
  548. (small!-modular!-number (times a b)))
  549. (de small!-modular!-minus (a)
  550. (small!-modular!-number (minus a)))
  551. (de small!-modular!-quotient (a b)
  552. (error "small-modular-quotient not implemented yet" (cons a b)))
  553. (de tolower (x)
  554. (!~let ((c (char!-code x)))
  555. (if (and (leq 65 c) (leq c 90))
  556. (code!-char (plus c 32))
  557. x)))
  558. (de explode2lc (x)
  559. (mapcar (explodec x) 'tolower))
  560. (de set!-print!-precision (n) n)
  561. (de constantp (x)
  562. (or (null x)
  563. (numberp x)
  564. (stringp x)
  565. (eq x t)))
  566. (dm iplus (x) (cons 'plus (cdr x)))
  567. (dm itimes (x) (cons 'times (cdr x)))
  568. (dm ilogand (x) (cons 'logand (cdr x)))
  569. (dm ilogor (x) (cons 'logor (cdr x)))
  570. (dm ilogxor (x) (cons 'logxor (cdr x)))
  571. (de idifference (a b) (difference a b))
  572. (de iquotient (a b) (quotient a b))
  573. (de iremainder (a b) (remainder a b))
  574. (de ilessp (a b) (lessp a b))
  575. (de ileq (a b) (leq a b))
  576. (de igreaterp (a b) (greaterp a b))
  577. (de igeq (a b) (geq a b))
  578. (de iequal (a b) (equal a b))
  579. (de iplus2 (a b) (plus2 a b))
  580. (de itimes2 (a b) (times2 a b))
  581. (de ilogand2 (a b) (logand2 a b))
  582. (de ilogor2 (a b) (logor2 a b))
  583. (de ilogxor2 (a b) (logxor2 a b))
  584. (de iadd1 (a) (add1 a))
  585. (de isub1 (a) (sub1 a))
  586. (de iminus (a) (minus a))
  587. (de iminusp (a) (minusp a))
  588. (de boundp (x)
  589. (not (atom (errorset x nil nil))))
  590. (dm declare (x) nil)
  591. (de ordp (u v)
  592. (cond
  593. ((null u) (null v))
  594. ((vectorp u) (cond
  595. ((vectorp v) (ordpv u v))
  596. (t (atom v))))
  597. ((atom u) (cond
  598. ((atom v) (cond
  599. ((numberp u) (and (numberp v) (not (lessp u v))))
  600. ((idp v) (orderp u v))
  601. (t (numberp v))))
  602. (t nil)))
  603. ((atom v) t)
  604. ((equal (car u) (car v)) (ordpl (cdr u) (cdr v)))
  605. ((flagp (car u) 'noncom) (cond
  606. ((flagp (car v) 'noncom) (ordp (car u) (car v)))
  607. (t t)))
  608. ((flagp (car v) 'noncom) nil)
  609. (t (ordp (car u) (car v)))))
  610. (de ordpl (u v)
  611. (cond
  612. ((atom u) (ordp u v))
  613. ((equal (car u) (car v)) (ordpl (cdr u) (cdr v)))
  614. (t (ordp (car u) (car v)))))
  615. (de ordpv (u v)
  616. (error "ordpv not yet implemented" (cons u v)))
  617. (de orderp (u v)
  618. (prog ()
  619. (setq u (explodec u))
  620. (setq v (explodec v))
  621. (while (and u v (eq (car u) (car v)))
  622. (setq u (cdr u) v (cdr v)))
  623. (cond
  624. ((and u v)
  625. (return (lessp (char!-code (car u)) (char!-code (car v)))))
  626. (v (return t))
  627. (t (return nil)))))
  628. (dm function (x) (cons 'quote (cdr x)))
  629. (de sort (items fn)
  630. (prog (tree)
  631. (dolist (x items)
  632. (setq tree (sort_insert x tree fn)))
  633. (return (sort_flatten tree))))
  634. (de sort_insert (item tree fn)
  635. (cond
  636. ((null tree) (list!* item nil nil))
  637. ((apply2 fn item (car tree))
  638. (sort_insertleft item tree fn))
  639. (t (sort_insertright item tree fn))))
  640. (de sort_insertleft (item tree fn)
  641. (list!*
  642. (car tree)
  643. (sort_insert item (cadr tree) fn)
  644. (cddr tree)))
  645. (de sort_insertright (item tree fn)
  646. (list!*
  647. (car tree)
  648. (cadr tree)
  649. (sort_insert item (cddr tree) fn)))
  650. (de sort_flatten (x)
  651. (cond
  652. ((null x) nil)
  653. (t (append (sort_flatten (cadr x))
  654. (cons (car x) (sort_flatten (cddr x)))))))
  655. (de gcdn (a b)
  656. (cond
  657. ((minusp a) (gcdn (minus a) b))
  658. ((minusp b) (gcdn a (minus b)))
  659. ((greaterp b a) (gcdn b a))
  660. ((zerop b) a)
  661. (t (gcdn b (remainder a b)))))
  662. (de abs (x)
  663. (if (minusp x) (minus x) x))
  664. (de max (a b)
  665. (if (greaterp a b) a b))
  666. (de min (a b)
  667. (if (lessp a b) a b))
  668. (de msd (n)
  669. (prog (r)
  670. (setq r 0)
  671. (while (not (zerop n))
  672. (setq n (quotient n 2))
  673. (setq r (add1 r)))
  674. (return r)))
  675. (de lsd (n)
  676. (if (zerop n)
  677. 0
  678. (prog (r)
  679. (setq r 0)
  680. (while (zerop (remainder n 2))
  681. (setq n (quotient n 2))
  682. (setq r (add1 r)))
  683. (return r))))
  684. (de ash (a n) (leftshift a n))
  685. (de ash1 (a n)
  686. (if (minusp a) (minus (leftshift (minus a) n)) (leftshift a n)))
  687. (de remd (x) (print (list 'remd 'called 'on x)))
  688. (de modulep (x) nil)
  689. (de verbos (x) nil)
  690. (de getenv (x) nil)
  691. (de filep (x) nil)
  692. (de plus2 (a b) (plus a b))
  693. (de times2 (a b) (times a b))
  694. (de logand2 (a b) (logand a b))
  695. (de logor2 (a b) (logor a b))
  696. (de logxor2 (a b) (logxor a b))
  697. (de lengthc (x) (length (explodec x)))
  698. (de gctime () 0)
  699. (de setpchar (x) nil)
  700. (de eqn (a b) (equal a b))
  701. (de threevectorp (x)
  702. (and (vectorp x) (equal (upbv x) 2)))
  703. (de frexp (x)
  704. (prog (n)
  705. (if (zerop x) (return '(0 . 0.0)))
  706. (setq n 0)
  707. (while (geq x 1.0)
  708. (setq x (times x 0.5))
  709. (setq n (add1 n)))
  710. (while (lessp x 0.5)
  711. (setq x (times x 2.0))
  712. (setq n (sub1 n)))
  713. (return (cons n x))))
  714. % End of vslcompat.lsp