第4回 慢性的CL勉強会[まとめ]

Lingrのログはこちら
*疑問への回答*
今回もまた質問に答えていただきました。
いつも本当にありがとうございます。
– carを書き換えるnreverse
リストの要素の方を入れ替えれば可能。
HyperSpecにもcar/cdrのどちらを書き換えても良いと書いてあるそうです。

(format t "Test ~A ~:[FAILED~;passed~].~%"
',name (progn ,@body))

(format t ~:[にる~;てー~]~%” t) ;=> てー
(format t ~:[にる~;てー~]~%” nil) ;=> にる
だそうです。

,@(when condition
`((,condition () (format t "Test ~A passed.~%"
',name))))

,@ を , に変更して、 ((,condition …)) を (,condition …) に変更すると、
conditionがnilであるとき、この式全体がnilとして残ってしまいます。
@nilを使えば、@,nilとなってnilが消えるという仕組みです。
これはwhenの条件部がnilのときの値はnilになるということに基づいていますが、
whenの戻り値を使うべきではないという宗派もあるため、
ifやandを使うべきという意見もあるようです。
ちなみにschemeのwhenは条件部が偽のときの値は未定義だとか。
今回は勉強会後の雑談コーナーが一番熱かった気がします(笑)
*がんばって自分で調べてみた*
自分で投げかけた疑問を放置しておくのもどうかと思うので、
一部だけですが自分で調べてみました。
以下の内容は全てCLtL2日本語版を参考にしています。
– read-from-string
文字列を与え、それをリーダによってLispオブジェクトに組み立てて返す関数。
読み込まれなかった文字列の中の最初の添え字も返すとのこと。
– potential number(潜在的な数)
数の構文の拡張を可能にするために定義された構文。
潜在的な数であり、なおかつ実際の数の構文に合わないようなトークンは、
すべて予約語となり、処理系に依存した解釈となるそうです。
処理系はエラーを発しても良いし、シンボルとしてトークンを扱っても良いし、
あるいは何か他の行動をとっても良いとか。
まあ、使わない方が無難なようです。
– proclaim
宣言の効果をグローバルに持たす「関数」。
(proclaim ‘(type float tolerance))
を評価すると、toleranceの動的な値は常に浮動小数点数となるべきことを指定するそうです。
関数であるため、コンパイル時に効力を期待するなら、
eval-whenで囲むか、declaimを使うべきだとか。
– declaim
proclaimと同様のことを行う「マクロ」。引数は評価されない。
コンパイル時に宣言がなされることになるそうです。

毎週、何かしらの資料を読んで、
おまけに疑問に対する回答まで頂いてるため、
ここ数週間でかなりCLに対する知識が増えた気がします。
ただ、短いサンプルソースといったようなものしか読んでいないため、
本当にCLを使えるようになるためには、もっと実践的なソースを読んだり、
なにかモノを作ったりする必要がありそうです。
早くCLerになりたい!!

おまけ

# onjo
# いやいやよく考えてください、 ((((foo)))) こんな呼び出し嬉しくない。
# (funcall (funcall (funcall (funcall foo)))) 何回呼んだかすぐわかる。カッコの数を数えるなんて苦痛。

いやいやよく考えてください、
(funcall (funcall (funcall (funcall ;゚Д゚))))
こんな呼び出し嬉しくない。
(((( ;゚Д゚))))
顔文字であることがすぐに分かる。崩れた顔文字は苦痛。
なんてことを考えてしまったwww

Leave a Reply