Ich hatte mal etwas mit muLISP gespielt (weil ich mir früher mal mit AutoLISP in AutoCAD ein paar Grafik-Import-Routinen programmiert hatte).
Prinzipiell funktioniert es, ist aber doch relativ limitiert und weicht auch in einigen Punkten von den bekannteren LISP Dialekten ab.
Am meisten fiel mir auf:
- viele sonst üblich Bezeichnungen sind anders und lang (z.B. "PLUS" anstelle von "+")
- keine Fließkommazahlen (wie klassisches FORTH)
- die meisten Funktionen nehmen nur zwei Parameter und keine Listen, andere LISPs nehmen beliebig viele, z.B. (+ 1 2 3 4 5) und liefern die Summe aller Zahlen in der Liste. muLISP nimmt nur zwei und liefert in diesem Falle "3" als Ergebnis).
Zum Spielen habe ich mir mit einem Texteditor (Turbo Pascal in meinem Fall) eine Datei MYDEFS.LIB mit meinen Definitionen erstellt, damit ich nicht immer alles eintippen muss (und Klammern zählen)
Diese Datei kann man dann schnell mit
(RDS MYDEFS LIB)
in muLISP einlesen.
Darin habe ich mir ein paar der üblicheren Funktionsnamen definiert:
% math %
(PUTD (QUOTE *) (QUOTE (LAMBDA (A B) (TIMES A B))))
(PUTD (QUOTE /) (QUOTE (LAMBDA(A B)(QUOTIENT A B))))
(PUTD (QUOTE +) (QUOTE (LAMBDA(A B)(PLUS A B))))
(PUTD (QUOTE -) (QUOTE (LAMBDA(A B)(PLUS A (MINUS B)))))
(PUTD (QUOTE >) (QUOTE (LAMBDA(A B)(GREATERP A B))))
(PUTD (QUOTE <) (QUOTE (LAMBDA(A B)(GREATERP B A))))
(PUTD (QUOTE ABS)(QUOTE(LAMBDA(A)((< A 0)(MINUS A))A)))
(PUTD (QUOTE INC) (QUOTE (LAMBDA(A)(+ A 1))))
(PUTD (QUOTE DEC) (QUOTE (LAMBDA(A)(- A 1))))
% define function %
(PUTD DEFUN (QUOTE (NLAMBDA (FUNC EXP)
((EQUAL (GETD FUNC) EXP))
( ((NULL (GETD FUNC)))
(PRIN1 "*** REDEFINING ")
(PRINT FUNC) )
(PUTD FUNC EXP)
FUNC )) )
% FOR Schleife (for prozedurale Denker)
(PUTD (QUOTE FOR) (QUOTE (LAMBDA (FROM TO STEP EXE I)
( (SETQ I FROM)
(LOOP ((GREATERP I TO))
(EVAL EXE)
(SETQ I (+ I STEP)))
))))
% set variables %
(DEFUN SETQQ (NLAMBDA(NAME EXP)(SET NAME EXP)NAME))
(DEFUN PUTQQ (NLAMBDA(NAME ATM EXP)(PUT NAME ATM EXP)NAME))
(DEFUN FLAGQQ (NLAMBDA(NAME ATM)(FLAG NAME ATM)NAME))
Die dort definierte "FOR" Schleife kann man dann z.B. so verwenden:
(FOR 1 10 2 (QUOTE ((PRIN1 I)
(PRIN1 " * 2 = ")
(PRINT (* 2 I)))))
Sicher nicht sehr LISP-konform, aber immerhin...