純LISP Test

未完成・開発途中(2013/06/13)
制限事項
1行につき1つのリストしか設置できない(複数のリストを設置した場合エラーになる)
1つのリストを複数の行に分けて設置できない(複数の行に分けた場合エラーになる)
コメント文( ; (セミコロン)で始まる文)に対応してない(リストの後尾にコメント文がある場合エラーになる)
ソースファイル(lisp3.js)

LISPコード入力



実行結果


開発デバッグ用出力


説明(特別式)

名前引数説明
COND(値 値)* (値 値)* ... 引数の各リストを順次評価していく(リストは1つ以上必要)
引数のリストの先頭の値がNIL以外なら続く値を返す
引数のリストの先頭の値がNILなら次の引数のリストを評価する
(COND ('A 'B) ('T 'C)) ; B
(COND ('NIL 'B) ('T 'C)) ; C
LAMBDA(シンボル* シンボル* ...)* 値*ユーザ関数を設定する
第一引数のリスト内のシンボルはユーザ関数の仮引数となる
仮引数となるシンボルのリストは空でも可能
第二引数に実行する処理の値を渡す
ユーザ関数への参照を返す
(LAMBDA (X Y) (CONS (CONS X X) (CONS (Y Y))))
(LAMBDA () 'A)
LABEL(DEFINE)シンボル* 値or参照第一引数のシンボルに第二引数の値or参照を設定する(変数設定)
第一引数のシンボルにT NIL COND LAMBDA LABEL QUOTE CONS CAR CDR EQ ATOMは使用できない
(LABEL A 'B)
(CONS A A) ; (B . B)
(LABEL F (LAMBDA (X Y) (CONS X Y)))
(F 'A 'B) ; (A . B)
QUOTE値*引数を評価せず返す
' (シングルクオート)で略記できる
(QUOTE A) ; A
'A ; A
(QUOTE (A B)) ; (A B)
'(A B) ; (A B)
参照:関数や特別式の本体(中身)。リストを評価するときにリストの先頭に渡される実体。
値:シンボルもしくはリスト
*:*マークは関数・特別式の処理時に評価しない部分を表す(*マークが無い引数は全て評価される)
評価:シンボルならLABELで設定された値を返す。リストならリストの先頭を関数または特別式、リストの後方を引数として処理する

説明(関数)

名前引数説明
CONS値 値2つの引数でリストを作る(CONS 'A '(B C)) ; (A B C)
CARリストリストの先頭を取り出す(CAR '(A B C)) ; A
(CAR '()) ; ()
CDRリストリストの後方を取り出す(CDR '(A B C)) ; (B C)
(CDR '()) ; ()
EQ値 値2つの引数が同じシンボルならT
それ以外はNIL
(EQ 'A 'A) ; T
(EQ 'A 'B) ; NIL
(EQ '(A . B) '(A . B)) ; NIL
ATOM引数がシンボルならT
それ以外はNIL
(ATOM 'A) ; T
(ATOM '(A B)) ; NIL
値:シンボルもしくはリスト
*:*マークは評価しない部分を表す(*マークが無い引数は全て評価される)
評価:シンボルならLABELで設定された値を返す。リストならリストの先頭を関数または特別式、リストの後方を引数として処理する

参考

純LISP - Wikipedia
http://ja.wikipedia.org/wiki/%E7%B4%94LISP
RECURSIVE FUNCTIONS OF SYMBOLIC EXPRESSIONS AND THEIR COMPUTATION BY MACHINE (Part I)
http://www-formal.stanford.edu/jmc/recursive.html