文体練習 三日ぶりに外に出ると雪が積もっていた
もう夕方なのでずいぶん踏み荒らされているが私は
未踏の箇所を慎重に選んで歩く
湿気たかき氷の音がした
雪が靴に侵入して地面は濡れていた
どうやら私は滑って頭を打ったようだ
(define (f x) (* x 2))
という手続きについて、以下を生成したい.
(lambda (x) (f (f x)))
よくみればただの関数合成だけれど、それは置いておいて. cut
を使って簡潔に表したい.
> (cut f (f <>))
gosh> f
としたいのだが、上手く関数適用できない.
> ((cut f (f <>)) 3)
gosh> *** ERROR: Compile Error: wrong number of arguments: #f requires 0, but got 1
"(stdin)":2:((cut f (f <>)) 3)
f
に関数適用はできないよ、というメッセージに読める.
試しに
> (disasm (cut f <>))
CLOSURE #<closure #f>
main_code (name=#f, code=0x833e5d0, size=4, const=1, stack=4):
args: #f
0 LREF0-PUSH ; x
1 GREF-TAIL-CALL(1) #<identifier user#f>; (f x)
3 RET
x
をとって、 f
を呼んで、返す.
> (disasm (cut f (f <>)))
CLOSURE #<closure #f>
main_code (name=#f, code=0x83c4dc0, size=9, const=3, stack=11):
args: #f
0 PRE-CALL(1) 6
2 GREF-PUSH #<identifier user#<>>; <>
4 GREF-CALL(1) #<identifier user#f>; (f <>)
6 PUSH-GREF-TAIL-CALL(1) #<identifier user#f>; (f (f <>))
8 RET
マクロによって <>
を引数とする lambda
で囲まれるはずなのに、 <>
がそのままIDとして生き残ってる. マクロそのものについての勉強と、その後改めて cut の仕様を知るべきだ.
恥ずかしいけれど、(use srfi-1)で、take, drop, iota, fold, fold-right が使えることを今日はじめてしった.compose もその中にあった.
gosh> ((compose f (cut f <>)) 3)
12
めでたしめでたい
日記らしい日記です. Schemeを書いてる時が楽しいです.連続系アルゴリズム演習の 数値計算が楽しいです.プログラミング言語を誰も指定してこないのが 楽しいです.私はSchemeをずっと使い続けたいです.
F#は楽しいのにOCamlになった途端つまらなくなります 標準のライブラリ、モジュールが貧相であることだけに 起因しません.私の第一印象の問題です. OCamlはなんだか気持ち悪い. もしかしたらやはりインデントがなってないとF#は動かないからかしら.
本当に今は学校のことを全然やってません. 先に言った連続系アルゴリズム演習だけ、それにあわせて座学の方の 連続系アルゴリズムだけ、楽しいです.