Posted 2016-12-06 16:54:06 GMT

方言の系統

MACLISP

主要開発者

Richard Greenbratt、Jon L White、Guy L. Steel, Jr.、Kent Pitman

登場時期

1965年

特徴

実用性を追求した処理系。

1980年代まで人工知能研究に於て基盤となって活躍した。

現在Lisp的と思っていることの多くがMACLISPで導入されたものであることは多い。

後続への影響

Common Lisp、Lisp Machine Lisp、Franz Lisp等、MACLISP系の大元

概要

MACLISPは現在広く利用されている、Common Lisp、Schemeの大元の流れを作った方言です。

極初期のことを記述した文献が残っていないようなので、詳細は不明なのですが、1965年にPDP-6がMITに納入され、その直後からRichard Greenblatt氏が実装を開始しPDP-6 LISPとして実現します。そして1966年にはもうAIラボ内で普通に活用されるようになっていたようです。

そして、1968年あたりにPDP-6の後継機であるPDP-10が導入される頃には、MACLISPという名称に変更されます。

この1968年あたりから主要な開発者はJon L White氏が担当していたようで、更新作業の記録(LISP NEWS)が残っています。

1972年頃には、Guy L. Steel, Jr.氏が参加するようになり色々な機能を加えています。

LISP NEWSから面白そうな所を抜粋すると

1)"DEFUN" IS AN FSUBR USED TO DEFINE FUNCTIONS. EXAMPLES ARE (DEFUN ONECONS (X) (CONS 1 X)) WHICH IS EQUIVALENT TO (DEFPROP ONECONS (LAMBDA (X) (CONS 1 X) EXPR) AND (DEFUN SMASH FEXPR (L) (RPLACD L NIL)) IS EQUIVALENT TO (DEFPROP SMASH (LAMBDA (L) (RPLACD L NIL)) FEXPR) THE NOVEL FEATURE OF "DEFUN" IS THAT ONE NEED NOT BE SO CONCERNED WITH BALANCING PARENTHESES AT THE VERY END OF THE FUNCTION DEFINITION, SINCE THE TYPE FLAG MAY BE OMITTED IF IT IS "EXPR", AND APPEARS NEAR THE FRONT OF THE "DEFUN" LIST IF IT IS SOME OTHER. ALSO, THE "LAMBDA" NEED NOT BE DIRECTLY INSERTED. 2)A FAST "DO" SIMILAR TO THE FORTRAN DO FEATURE NOW EXISTS. THE SYNTAX IS (DO ATOM INITIALVALUE STEPFUN ENDTEST STATEMENT1 . . . STATEMENTN) WHERE "ATOM" IS THE INDEX VARIABLE OF THE LOOP, WHICH IS INITIALLY SET TO THE EVALUATION OF "INITIALVALUE", AND IS RESET EACH PASS THROUGH THE LOOP TO THE EVALUATION OF "STEPFUN". "STATEMENT1" TO "STATEMENTN" COMPRISE A REGULAR PROG BODY (EXCEPTING THE LIST OF PROG VARIABLES) WHICH IS EXECUTED REPEATEDLY UNTIL "ENDTEST" EVALUATES TO NON-NIL. FOR EXAMPLE, (DO I 0 (ADD1 I) (EQ I 400) (COND ((NULL (A I)) (GO B))) (PRINT (A I)) B (SETQ TOTAL (PLUS TOTAL (A I))))

LISP NOW HAS TWO MORE FUNCTIONS: [1] PROGN, AN LSUBR OF 0 OR MORE ARGS, WHICH (ODDLY ENOUGH) RETURNS ITS LAST ARGUMENT (NIL IF NO ARGS). [2] FUNCALL, AN LSUBR OF 1 OR MORE ARGS. (FUNCALL F X1 X2 ... XN) CALLS THE FUNCTION F WITH ARGUMENTS X1, X2, ... XN. THIS IS USEFUL IN SITUATIONS WHERE ONE WANTS TO EVALUATE SOME EXPRESSION TO OBTAIN THE FUNCTION. THUS (FUNCALL (CAR X) A B C) IS SIMILAR TO ((CAR X) A B C) BUT LOOKS NICER. ITS PRIMARY USE IS IN THE CASE WHERE SOME VARIABLE HAS A FUNCTION AS ITS VALUE, BUT MAYBE ALSO HAS A FUNCTION PROPERTY. EXAMPLE: ((LAMBDA (CAR) (CAR X)) 'FOO) RETURNS THE RESULT OF APPLYING THE FUNCTION CAR TO THE VALUE OF X; HOWEVER ((LAMBDA (CAR) (FUNCALL CAR X)) 'FOO) RETURNS THE RESULT OF APPLYING THE FUNCTION FOO TO X.

等々面白い記述が多いです。

上記 funcall については所謂Lisp-2はfuncallが必須と思っている方が多いので、逆に funcall がそれまで存在しなかったのかと不思議に思うかもしれませんが、Lisp処理系では関数ポジションがどのように評価されるかでも挙動が違ってきます。

Common Lispは一度も評価されませんので、

((LAMBDA (CAR) (CAR X)) 'FOO)

とあった場合は、 CAR の関数を拾うことになります。仮に CAR の関数が未定義であった場合には未定義のエラーとなります。

MACLISPの場合は、アトムが出てくるまで評価します。上記の場合、

((LAMBDA (CAR) (CAR X)) 'FOO) => ('FOO X) => (FOO X)

となり FOO を呼び出すことになります。このような仕様なので、

((LAMBDA (CAR) (CAR X)) 'FOO)

のような名前の被りが発生してしまうケースは

((LAMBDA (CAR) (FUNCALL CAR X)) 'FOO)

と書くと明解だよねということで funcall が導入されたのでした。

ちなみにSchemeでは関数ポジションは引数ポジションと同じく一度だけ評価されますね。

その他、Lispの仕様的に大きな決断としては、浅い束縛の採用に大きく舵を切ったことが挙げられると思います。

個人的には、Lispマシンで浅い束縛システムはハードウェアの支援を活用することにより完成の域に達した(見えないポインタ、 closure 構文、等々)と考えているのですが、その辺りに詳しい方に一度実際どうだったのか伺ってみたいところではあります。

応用の例

MACLISP上に構築された歴史的に有名な応用は枚挙に暇がありません。代表的な所では、

SHRDLU

MACSYMA

言語だと、

LOGO

Micro PLANNER

SCHEME

MDL

PLASMA

Conniver

3-LISP

等々Lispベースのものは本当に沢山あります。

体験

MACLISPが稼動するITS、TOPS-20ともにsimhや、KLHのエミュレータ上で動きます。

リモートからログイン可能な公開サイトも幾つかあります。

興味のある方は実際に動かしてみましょう。

ちなみにliving computersのものは実機です(恐しや)

まとめ

現在、利用されているLispはMACLISP系か、Clojureのように比較的新しくできた方言に大別できます。

MACLISPの影響を非常に多く残しているのは、Emacs Lispですが、RMSはMACLISPで育ったことが非常に大きいと思います。

Emacs Lispは、Common Lispに由来していると思っている人が多いと思いますが、実際の所は、MACLISPから拾ってきているものが、同じ子孫であるCommon Lispにも存在するということが多いためそのように見える、ということだと思います。

参考文献

■

