clisp、emacs lisp、jpnslispの関数eval

S&S

 clisp(common lisp)で

>(let ((x 'hello))
    (eval '(print x)) )

を実行するとXが定義されていないというエラーになるが、 emacs lispで実行するとエラーにならず、HELLOが表示される。
 clispでは関数evalの実行時レキシカル変数(言わばローカルな変数) は巻き込まれない。これはコンパイルする時、Xが未決定であることに よるのであろう。emacs lispにコンパイラはない。
 さらには

>(defun test () (print y))
>(let ((y 'world))
    (test) )

としてもclispはYが未定義というエラーを出すがemacs lispでは WORLDが表示される。emacs lispはユーザ定義関数実行時ですら ローカルな変数を巻き込む。emacs lispはcommon lispではなく Lispの方言の1つとうたわれている。
 jpnslispではevalに関してはemacs lispのようにレキシカル変数を 巻き込む。jpnslispのC++ソースのある所をNULL、0にすれば レキシカル変数を巻き込まないようにすることができるが コンパイラもないことだしあるマクロ定義の際などに有用であると 思われるので残している(jpnslisp日本語Lisp3.11、jpnslisp 日本語Lisp for Linux2.11)。