9LISP 003の報告です。

勉強会の当日にブログを更新すると宣言しながら、更新しなかったid:shunsuk。です、ダメ人間です。ひとつ言い訳すると、勉強会の後、ブログを更新する気が起きなくて。それで更新しませんでした。だから、私は悪くないです。ダメ人間ではありません。むしろ、人格者です。


それでは、9LISP 003の報告です。課題のチェックと、質問コーナー。関数は、MIT記法とlambda記法のどっちがいいのか?は、決着がつかず。このブログでは、SICPに合わせてMIT記法でいいですか?ちなみに、Emacsにquack.elを入れると、lambdaと入力するとλに変換されてカッチョエエです。Vimでもできないのかということでしたが、λをlambdaと解釈する処理系つくればOKと適当に答えておきました。そう、適当なのです。


また、再帰の書き方はどれがいいのか?先日、再帰の書き方についての記事を書きました。

いろいろありますね。その後に気づいたのですが、SICPではdefineを入れ子にする書き方をしています。結局、これも結論は出ず。このブログではどの書き方で統一しましょうか?


次の質問です。大域変数の一覧は見れるのか?C#Scheme処理系を実装しているid:aharisuくんによると、実装依存だそうです。前回から、「実装依存」という回答が多いですね。それだけ、いろんな人が実装してるんでしょうね。


可変長引数は、なんであんな風に(下記参照)書くのか?

(define (func a b . c)
    (print c)))


回答はid:aharisuくん。定義です。そういうものらしいですよ。ここで、Schemeにも構文(シンタックス)があるという事実が暴露されました。例えば、defineは先頭にしか書けないとか。そこで、Schemeの仕様書R5RS(日本語訳あり)を読もうという話になりました。

次回か、その次までに読みましょう。できれば、Schemeを実装してみましょう。ハードル高い。。。


続いて、チャレンジ問題の答えあわせ。それについては、1問ずつこのブログで解説していこうかと思っています。FizzBuzzだけでもいろんな書き方があるので、みんなのコードを見れるといいね。ということで、私はcodepadがいいかなと思っています。


そして、id:aharisuくんが衝撃の暴露話。割り算の余りを求めるremainderとmoduleは動作が違うんだそうです。負数で割ると、違いが現れます。

(remainder 10 -3) ; 1 他言語(CやC#)の%
(modulo 10 -3) ; -2 第2引数の符号と一致する


へー。他のプログラム言語では、mod関数が多そうなので、moduloを使っていました。でも、他言語と同じ動作をするのは、remainderなんですね。


リストを作ってくれる便利関数があります。

(iota n 1)


これは、組み込み関数ではありません。srfi-1というライブラリを呼び出すと使えるようになります。srfiは1からはじまる番号で管理されてるので、ビミョーというお話。


id:aharisuくんが、またまた暴露話。条件分岐のcondには、レシピエント形式というのがあります。

(cond (2 => /)) ;=> 1/2
(cond (#f => /) (#f => +) (10 => display)) ;=> 10


解りますか?上の式では、2がtrueなので(Schemeでは#f以外はtrue)、(/ 2)が評価されます。下の式では、10がtrueなので、(display 10)が評価されます。id:aharisuくん曰く、使い道が分からないとのこと。


で、結局、R5RS読もうということに。


というカンジです。ガシガシ、コード書こうぜ!と言いつつ、おしゃべりだけで終ってしまいました。まあ、濃い話なのでいいかと。そして、課題の出し方ですが、何かに沿って進めていってはどうか。ということで、「The Little Schemer」を使うことになりました。


The Little Schemer (The MIT Press)

The Little Schemer (The MIT Press)


持ってない人は買いましょう。valvallowさんによると、英語だけど読みやすい。むしろ、英語が読めるようになったそうです。初参加で持ってない人は、その時だけ何とかします。


報告は以上です。参加者のみなさん。補足はコメント欄で。私は他力本願です。そう、他力本願なのです。ダメ人間です。ひとつ言い訳すると、やる気がないんです。だから、私は悪くないです。ダメ人間ではありません。むしろ、人格者です。