2010/04/18

LISP・・・読み物?

memo
ソーシャルブックマークを使えば良いんでしょうけども・・・。はてブ?delicious?

読み物いくつか

読み物をいくつかメモ。

追加しようと思いましたが、別口で。
ソフトウェア開発者採用ガイドEric Sink on the Business of Software 革新的ソフトウェア企業の作り方

Pro Git 日本語PDF

PDFがあったのでメモ。

入門Git 実用Git

9LISP - 012, 013, 014


まとめ(?)を書いていませんでした。

012

高階関数の練習問題などをやりました。高階関数の例題がなかなか思いつきませんでした。木構造関連の例題をやりました。何か良い例題というか問題はないでしょうか・・・。

午後は量子論。

013

マクロに入りました。
どのように進めて行くか話合いました。
何を作るか話し合いました。
午後は、きゅーりすぷたん検討会。(こっちの方が盛り上がったかもしれない)

014

  • Common Lisp処理系を入れましょう(次回までに)
  • Common LispとSchemeについて違いを少々
    • t, nil, (car '()), undef, defun, dynamic-scope, funcall, setf, zerop, など
  • quote類について
書けばイメージもそれなりに湧くはず、ということで。マクロは書かないと書けるようにはならない。たぶん。

例えば、PostScriptのこんなコードが・・・、
/x 10 def
/y 10 def
x y moveto
5 5 lineto
S式でこういう風に書けたら、うれしくね?
((let ((x 10)
       (y 10))
   (lambda (x1 y1)
     (moveto x y)
     (lineto x1 y1))) 5 5)
ということで。


私の端末には、CLISP, SBCL, AllegroCLが入っています。Emacs+SBCL+SLIMEでやってみることにします。そういえば今回、これがLISPだ! (Information & computing (30)) を始めて目にしました。


Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~LET OVER LAMBDA Edition 1.0初めての人のためのLISP[増補改訂版]

quasiquoting

さっそく、マクロに使うテクニックを。クォートが4種類あります。それぞれの名前は覚えていません。
より

  • quoteは式を評価せず式のまま返す
  • quoteは'(シングルクォート)記号で代用できる
  • quasiquoteはquoteに似ているが、式の中でunquoteとunquote-splicingが使える
  • quasiquoteは`(バッククォート)記号で代用できる
  • unquoteは式の値を評価し、評価結果を式に埋め込む
  • unquoteは,(カンマ)記号で代用できる
  • unquote-splicingはリストの外側の括弧を取り払ってその場に展開する
  • unquote-splicingは,@(カンマとアットマーク)記号で代用できる
  • quote, quasiquote, unquote, unquote-splicingは特殊形式である



プログラミングGauche

2010/04/17

自転車置場の議論 (bikeshed discussion)

さっき@toshi_aさんに教えてもらいました。面白かったのでメモ。
「瑣末なことほど議論が紛糾する現象」
プログラミングの世界では、インデントの数や括弧の前後の空白など、「自転車置場の議論」がごろごろと転がっています。


パーキンソンの法則
パーキンソンの法則
posted with amazlet at 10.04.17
C.N.パーキンソン
至誠堂
売り上げランキング: 32539
おすすめ度の平均: 4.5
5 役人の数は仕事量が減ろうが、増え続ける
4 人間観察のパーキンソン則は、現代でも廃れていない!
3 有名な格言(?)の元ネタにあたって、ともあれ満足
4 社会科学を科学しよう
5 社会科学を科学しよう

2010/04/13

LOL tree-leaves

これはtree-leaves%%までで十分だと思いましたが、どうなんでしょう。
予測できる使い方の範囲では、これが最も直感的で贅肉のない方法だと思う。
らしい。個人的には、むしろ直感的でなくなっているように思いますが・・・。


ところで、Gaucheで書くにあたり、何の気なしにfold-rightで書きましたが、これだとLOLに書かれているようなドットリストではうまくいきませんね。
fold-rightは関係ないですね。

このtree-leavesのところで「アナフォラ」という単語が出てきました。アナフォリックマクロ楽しみです。


LET OVER LAMBDA Edition 1.0

2010/04/11

LOL flatten

これもLOLより(というよりOn Lispより?)。Gaucheで書いてみましたが、これも探せばどこかにありそうですね。

fold-rightで書いてみましたが、大丈夫かな。なんか怪しいような気もする。もしかするとfoldでreverseな方が良いかな。いやfold-rightで大丈夫か。


追記

LOLより。Common Lispのlabelsはschemeのletrecみたいなもの、と考えて良いんだろう、きっと。なんかCLの方が美しい気がする(labelsに限らず)。


プログラミングGaucheLET OVER LAMBDA Edition 1.0On Lisp

2010/04/10

LOL mkstr, symb, group

mkstr, symb, groupはLet Over Lambdaで必要になるユーティリティ関数です。On Lispよりのものだそうです。On Lispは見事に積読中。
LOLはあの調子ですから読むのはサクサクなのですが、書くのが全然追いつきません。

internってなんぞ。symbの最後がvaluesなのもなぜだろう。わからないけど取り合えず放っておきます。以下コードはOn Lispより。

Gaucheで。(util.listに、groupと同等のslicesがあるそうです)

call-with-string-output-port・・・ってどこにあるんだろう。


(cut cons (+ a 1) <>) ≡ (lambda (x2) (cons (+ a 1) x2))
(cut list 1 <> 3 <> 5) ≡ (lambda (x2 x4) (list 1 x2 3 x4 5))
(cut list) ≡ (lambda () (list))
(cut list 1 <> 3 <...>)
≡ (lambda (x2 . xs) (apply list 1 x2 3 xs))
(cut <> a b) ≡ (lambda (f) (f a b))
部分適用便利だなー!

参考


追記

internの解説を教えていただきました。

プログラミングGaucheLET OVER LAMBDA Edition 1.0On Lisp

2010/04/07

print, print1, princ, pprint

CL-USER> (let ((v "hoge"))
           (list (print v)
                 (prin1 v)
                 (princ v)
                 (pprint v)))

"hoge" "hoge"hoge
"hoge"("hoge" "hoge" "hoge" NIL)

prin1
関数readに適した出力,すなわちLispプログラムに適した出力を生成する.
princ
prin1がLispプログラムに適した出力を生成するのに対し,princはユーザの見やすい出力を生成する.エスケープ文字も出力されない.
print
先頭に改行が付加される点を除いてprin1と同じである.
pprint
続くスペースを空行にすることを除いてprintと同じである.

(princ "\n\nこんにちわ!")


こんにちわ!
(prin1 "\n\nこんにちわ!")\n\nこんにちわ!

追記

どうでも良いことだけど、やっぱこうかな。
CL-USER> (mapcar (lambda (e)
                   (funcall e "hoge"))
                 `(print princ prin1 pprint))

"hoge" hoge"hoge"
"hoge"("hoge" "hoge" "hoge" NIL)