1
0
mirror of https://github.com/PDP-10/its.git synced 2026-05-05 23:54:18 +00:00

Added lots of new LSPLIB packages (and their sources).

This commit is contained in:
Eric Swenson
2018-03-16 13:50:36 -07:00
parent 13244c1d61
commit 92db560d8f
118 changed files with 35842 additions and 22 deletions

39
src/libdoc/carcdr.kmp1 Executable file
View File

@@ -0,0 +1,39 @@
;;; -*-LISP-*-
;;; Purpose: to permit long names, like CADADADADDDR, to be easily
;;; macro-defined into appropriate sequences of CARs and CDRs.
;;; Use: (DEF-CARCDR CADADADADDDR CADADADDDDDR ... )
;;; where the names must have at least 5 A/D's.
;;; Produces a format internal to the compiler when being expanded
;;; for optimal compilation. For interpretation, produces a
;;; LAMBDA form with a composition of initial carcdr functions
;;; of up to 4 deep, which should be (already) defined primitively.
(DEFMACRO DEF-CARCDR L
`(PROGN 'COMPILE
,@(mapcar '(lambda (x) `(DEFPROP ,x C*R MACRO)) l)))
(DEFUN C*R (X)
(DECLARE (SPECIAL CARCDR)) ;Gets the complr's CARCDR variable
(LET (((NAME ARG1 . L) X))
(AND L (ERROR '|Extra args in call to C*R macro| X 'WRNG-NO-ARGS))
(AND (OR (< (LENGTH (SETQ L (EXPLODEC NAME))) 7)
(NOT (EQ (CAR L) 'C))
(NOT (EQ (CAR (SETQ L (NREVERSE (CDR L)))) 'R))
(DO L (SETQ L (NREVERSE (CDR L))) (CDR L) (NULL L)
(AND (NOT (MEMQ (CAR L) '(A D))) (RETURN 'T))))
(ERROR '|Invalid name for C*R macro| X 'WRNG-TYPE-ARG))
`(,(COND ((EQ COMPILER-STATE 'COMPILE) `(,carcdr ,@(nreverse l)))
(`(LAMBDA (X) ,(|c*r-expander/|| l 'X))))
,arg1)))
(DEFUN |c*r-expander/|| (L ARG)
(COND ((< (LENGTH L) 5) `(,(implode (nconc (list 'C) l '(R))) ,arg))
((LET* ((/3TAIL (NTHCDR 3 L)) (/4TAIL (CDR /3TAIL)))
(RPLACD /3TAIL () )
(|c*r-expander/|| L (|c*r-expander/|| /4TAIL ARG))))))