PILS 0.1.15



PILS ist ein in JavaScript geschriebener Lisp-Interpreter für Übungszwecke, der kompatibel zu AutoLisp sein soll. Allerdings unterscheidet sich PILS auch ganz deutlich in der Funktionalität von AutoLisp, denn natürlich fehlt der gesamte Teil der Funktionen, die direkt mit AutoCAD bzw. der Geometrie zu tun haben.

Zum Anderen verbietet JavaScript (aus gutem Grund) das Öffnen von Dateien auf dem lokalen Rechner. Deswegen ist es nicht möglich, in diesem Übungsinterpreter Funktionen wie LOAD, OPEN, CLOSE, READ-LINE usw. zu implementieren.

Und schliesslich fehlt ein wenig der Funktionalität von AutoLisp an den Stellen, wo es mir schlicht zu mühsam war, sie zu implementieren. Die Funktion RTOS z.B. ignoriert das zweite Argument - sie wandelt immer in eine einfache dezimale Darstellung um. Eine Darstellung in anderen Zahlenformaten (wissenschaftlich, Fuß/Zoll usw.) beherrscht sie nicht. Ebenso fehlt WCMATCH - es lohnt sich nicht, einen Haufen Arbeit in diese Funktion zu investieren.

Andererseits geht die Funktionalität von PILS an ein paar Stellen über das hinaus, was AutoLisp bietet. Hier ist Folgendes zu nennen: Einige Hinweise zu den Funktionsargumenten:

Die FA-Liste in AutoLisp hat folgenden Aufbau: ([Arg [Arg [Arg ...]]] / [Var [Var [Var ...]]]) Sie darf ausschliesslich Symbole enthalten - andere Datentypen wurden in älteren AutoCAD-Versionen ignoriert, in neueren verursachen sie einen Fehler. Der Aufbau der FA-Liste in PILS sieht so aus: ([Arg [Arg [Arg ...]]] [optArg [optArg ...]] / [restArg] [Var [Var [Var ...]]]) Damit die neuen Argumente von den bisherigen unterschieden werden können, müssen sie als Listen angegeben werden.

Optionale Argumente sind als Conses anzugeben, die den Symbolnamen sowie den Vorgabewert enthalten. Das Symbol für die Restargumente wir einfach in Klammern angegeben, damit es von den lokalen Variablen unterscheidbar ist. Wichtig ist das Einhalten der Reihenfolge: Notwendige Argumente - Optionale Argumente - Schrägstrich - Symbol für Restargumente - lokale Variablen.

Beispiel 1:

    (defun f1(a b (c . 0) / )(+ a b c))

    (f1 3)        => Fehler
    (f1 3 4)      => 7
    (f1 3 4 5)    => 12
    (f1 3 4 5 6)  => Fehler
    
Beispiel 2:
    (defun mean(/(s))(/(apply'+ s)(length s)))

    (mean 4 4 3 3 5 5)   => 4
    (mean 5)             => 5
    (mean)               => Fehler
    


Was noch fehlt bzw. nicht funktioniert:

EQ, EQUAL sind noch nicht dabei. (= ...) testet auf Gleichheit von Werten. PRINC und PRINT sind vorhanden, aber noch nicht kompatibel. PRIN1 und PROMPT fehlen noch.

END ist das, was normalerweise LAST heisst, d.h. der letzte Node einer Liste. LAST ist in AutoLisp aber nun mal schon etwas anders definiert. (last '(a b c)) => C (end '(a b c)) => (C)

Änderungen von 0.1.14 -> 0.1.15:
Die Grundrechenarten bewältigen jetzt auch Floats, damit zusammenhängend sind jetzt auch MIN und MAX implementiert, die auf dem gleichen Mechanismus beruhen.

Neue Funktionen: RPLACA (!), RPLACD (!), STRCASE, SYMBOL-NAME, INTEGERP, FLOATP, STRINGP, SYMBOLP, ~ (alias: LOGNOT), LSH. BOOLE fehlt nach wie vor.

Eine Liste aller implementierten Funktionen:

            ~
            >
            >=
            <
            <=
            =
            +
            -
            *
            /
            1+
            1-
            ABS
            ACOS
            AND
            APPEND
            APPLY
            ASCII
            ASIN
            ASSOC
            ATAN
            ATOF
            ATOI
            ATOM
            BACKQUOTE
            BOUNDP
            BUTLAST
            CAR
            CDR
            CAAR
            CADR
            CDAR
            CDDR
            CAAAR
            CAADR
            CADAR
            CADDR
            CDAAR
            CDADR
            CDDAR
            CDDDR
            CAAAAR
            CAAADR
            CAADAR
            CAADDR
            CADAAR
            CADADR
            CADDAR
            CADDDR
            CDAAAR
            CDAADR
            CDADAR
            CDADDR
            CDDAAR
            CDDADR
            CDDDAR
            CDDDDR
            CEIL
            CHR
            COND
            CONS
            COS
            DEFUN
            EIGHTH
            END
            EVAL
            EVENP
            EXP
            EXPT
            FIFTH
            FIRST
            FIX
            FLOAT
            FLOATP
            FLOOR
            FOREACH
            FOURTH
            IF
            INTEGERP
            ITOA
            LAMBDA
            LAST
            LENGTH
            LET
            LET*
            LIST
            LISTP
            LOG
            LOGAND
            LOGIOR
            LOGNOT
            LSH
            MAPCAR
            MAPCDR
            MAX
            MEMBER
            MIN
            MINUSP
            NCONC (!)
            NINETH
            NOT
            NTH
            NTHCDR
            NULL
            NUMBERP
            ODDP
            OR
            PRINC
            PRINT
            PROGN
            QUOTE
            RANDOM
            READ
            REM
            REPEAT
            REST
            REVERSE
            ROUND
            RPLACA (!)
            RPLACD (!)
            ROUND
            RTOS
            SECOND
            SET
            SETQ
            SEVENTH
            SIN
            SIXTH
            SQRT
            STRCAT
            STRINGP
            STRLEN
            SUBST
            SUBSTR
            SYMBOL-NAME
            SYMBOLP
            TAN
            TENTH
            TERPRI
            THIRD
            TYPE
            VER
            UNLESS
            WHEN
            WHILE
            ZEROP