阿房峠

tunaguinfoのブログ

AutoLISP と Common Lisp と代入

  • 実はXLISP、と一概に言っても、Ver.1.0、2.0、と3.0ではまるで違う言語である。
  • XLISP1.0は過去の(現代の観点から言うと)貧弱なハードウェアでも動く小さいオブジェクト指向Lisp方言、XLISP2.0はCommon Lispのサブセットであった。
  • AutodeskVisual LISPはXLISP1.0から派生している。

XLISP - 紫藤のWiki

ということで、AutoLISPの練習としてCommon Lispを練習している。Common Lispの参考書は新しいものは少なくてしかも激高なのでつい、Schemeの入門書のようなところに手を出してしまう。そこには

Scheme は基本的に関数型プログラミング言語なので、基本的には代入を用いないでプログラムを書くことができます。しかし、代入を用いたほうがかえって簡潔に書ける場合もあり、 内部状態や継続を利用する時は代入を使う必要があります。

https://www.shido.info/lisp/scheme_asg.html もう一つのScheme入門 10.代入

と書いてある。代入しないなんて……。どうしたらいいんだろう。とまた手が止まる。

まあ、そういう時はあれだ、Google先生だ。で聞いた結果、やっぱりいつもの先生方との対面となるのだった。

関数型プログラミングでは、よく「代入は使ってはならない」と言われます。関数型言語の一種である Emacs Lisp を生業とする僕は、この言葉に長年悩まされてきました。代入を使わないで実用的なプログラムを書くことは無理だからです。

Emacs Lisp は、Common Lisp に近く、Common Lisp は命令型言語ですので、再代入は避けられないというのが、最近の僕の結論です。

関数型プログラミングと代入 - あどけない話 (山本和彦さん)

なので、安心してAutoLISPではsetqすることにした。

 

山本さんみたいなすごいヒトでも、呪いに縛られることがあるのか。しかし、それを解決できるところがすごいヒトのすごいところ。(なんだか「すごい」ってのは、言葉としてはずいぶんと安い感じではあるとは思うけど)

ちなみに、自分では自分自身、擬似科学とか代替医療とかにはわりと鼻が利くホウだと思っているのだけど、ことプログラミングのこととなるとまったく自信がない。多分代替医療に嵌るヒトはこういうプロセスを踏むことができずに、何を信用していいのかわからずに、でも何かを選択せざるを得ない状況で、仕方なく選んでしまうのだと思う。選んでしまえばそこには慣性が生じるので捨てることは難しいのでは、と思うのだった。

 

ところが、Lisp は完全な関数型言語ではありません。引数以外の変数を定義して、setq などで値を代入することができるからです。つまり、変数の値を書き換えることでプログラムを実行する「手続き型言語」の機能もあるわけです。とくに Common Lisp の場合、手続き型言語からいろいろな機能が持ち込まれたため、ほかの関数型言語に比べると不純度の高い関数型言語になっています。

M.Hiroi's Home Page / xyzzy Lisp Programming

ここにも!!。