落語・将棋・サイクリング時々Lispにわかに電子工作とプラモデル。PC98のレトロゲーム。Lisp落語・将棋・サイクリング時々Lispにわかに電子工作とプラモデル。PC98のレトロゲーム。オブジェクト指向黎明期も語るブログLisp2012年12月02日23:01カテゴリLispxyzzyを愛しているある職場でエディタがさくらエディタのみの場所があった。自分の好きなものを入れてはいけないというのだ。xyzzyを入れたい僕としては、これがとてつもないストレスになった。別にLispでそれほどコードを組むわけではないが、何か気晴らしにマクロを書いたり、Webで検索したコードを試したりするのが息抜きとなる。設計書作りというのも悪くは無いのだが、やっぱり僕はプログラマだなぁと思う。emacs系のエディタを使っている人はその使い勝手だけではなく、強力なLispという言語が付属していることによる、キッチンシンクな世界を味わっているのではないだろうか。いう理由もあって、僕はxyzzyエディタが無いとそれだけで落ち着かない。)2012年09月10日01:57カテゴリLisp破壊的代入とmultiple-value-bind僕がLispを美しいと感じるのは、ストレスを感じなく書けるからだと思う。アナフォリックマクロの記事でもそうなのだが、プログラムを書いている最中に不愉快な思考の停止が起こることがあり、これがプログラム中に感じるストレスの最たるものだと思う。改変すると途端に問題が起こる上、汚くなる。それを嫌うならば書き直す必要が出てくるのでプログラム効率はかなり落ちる。いったちょっとした「何でこんなことが出来ないのか!」というのは多々あるが、今回のmultiple-value-bindもそれだ。先日ソースコードのコメントに”破壊的代入”と書いたら、変なコメント入れないでくださいと言われた。今まで会話の中で普通に破壊的代入という言葉を使ってきたのだが、改めて意味を知っているかと聞くと知らないと言う人が多かった。いうか、知らないなら聞けよ。破壊的代入とはCならポインタとか、VBならbyrefとかいう奴のことだ。関数の呼び出し元で渡された変数が、読み出し先の関数で改変されてきてしまう場合だ。1まぁ、普通一つの値を返すだけの関数ならこんなことをせずに、計算結果を復帰すればよい。明らかにこちらのほうが綺麗であるし、バグが少ない。1ただし、複数の値を復帰したい場合に、通常の手続き型言語ではそういった機構がなく、やるならばそのためにわざわざ構造体(クラスでも可だが、クラスにした瞬間に参照型になるので破壊的代入と同じになる言語が多い)、型が同一ならば配列を定義する必要がある。いうのは正直やりすぎなので、例1のようなアプローチを応用するのは仕方が無い。1手続き型の言語(大方のオブジェクト指向型含む)は副作用を容認するため仕方が無い。以下のように書きたいが、文法上不可能である。1Lispならばこれで良い。b1)))くどくなるがポイントは1.呼び出し先で複数の値を復帰できる2.呼び出し元で複数の値を取得できる3.すべて値渡しなので副作用は無い(つまり例1ではなく例2のようなアプローチが可能となる)このようにLispは綺麗でストレスがたまらない言語なのだ。これ読んでLispはじめる人が居たら良いなぁ。)2012年05月15日00:08カテゴリLispアナフォリックマクロ昔居た会社にシンボリック社日本法人の元社員が数人居た。当然というか何と言うか彼らはLisperであり、それについて熱く語る人たちだった。いった会社に居たにもかかわらず、結局Lispがどれほどすごい言語なのかさっぱりわからなかった。Lispの真価を知ったのは、そのマクロ機能を解説した以下の本を読んでからだ。Lispクチコミを見るどんな言語でも良いのだが、ある関数(hogeCalcとする)の結果を元に分岐をしたいとする。ほとんどのプログラマは次のように書くことだろう。{処理}-----------------------------------------------------------コード1で、ここでhogeCalcで計算した結果を他の部分でも使わなければならないという事態が発生したとする。するともうこの構文は使用できない。if文の中を変更するのが嫌ならばhogeCalcをもう一度呼ぶしかない。100------------------------------------------------------------コード1-3こうなるとソースコードを見られた場合に結構恥ずかしい。気にしない人もいるが(当然僕だ)hogeCalcが軽い処理の場合は3回呼び出そうが1回呼び出そうが関係なくソースコードが汚いだけで済むのだが、hogeCalcがデータベースに接続したりする場合は、処理の時間が秒単位で変わる。悪態をつきながらも、以下のように書き直さざるを得ない。100------------------------------------------------------------コード1-4これは現行の手続き型言語ではどうしようもない。それはIF文がそういったものだからだ。”IF文の条件で実行された値を保持する”というIF文を作ってしまえば良いではないか、これがLispの発想だ。新たにaif(アナフォリックIF)という特殊なIF文を作成する。これはIFの条件部分で実行された結果が特定の変数に代入されるというものだ。この場合"it"と変数に結果が入る。同じ)のように書いているが、残念ながらこれら現在主流となっている言語ではこのようなことは出来ない。Lisp等の関数型言語(Perlでも出来そうだけど、未確認)以外では実現困難だ。別にif文だけでなく、特殊なループ文を自分で作成することが出来る。LispにはCで言うところのfor文がないので、自前でfor文を用意することになる。言語自体はいかようにも拡張可能な言語ということだ。これ読んでLispはじめる人が居たら良いなぁ。将棋と正座~将棋指しは芸人である。