月報 2013/01

Jan 14 2013

This says "More Use Me!"

文体練習 三日ぶりに外に出ると雪が積もっていた
もう夕方なのでずいぶん踏み荒らされているが私は
未踏の箇所を慎重に選んで歩く
湿気たかき氷の音がした
雪が靴に侵入して地面は濡れていた
どうやら私は滑って頭を打ったようだ

(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

めでたしめでたい

Jan a day 2013

日記らしい日記です. Schemeを書いてる時が楽しいです.連続系アルゴリズム演習の 数値計算が楽しいです.プログラミング言語を誰も指定してこないのが 楽しいです.私はSchemeをずっと使い続けたいです.

F#は楽しいのにOCamlになった途端つまらなくなります 標準のライブラリ、モジュールが貧相であることだけに 起因しません.私の第一印象の問題です. OCamlはなんだか気持ち悪い. もしかしたらやはりインデントがなってないとF#は動かないからかしら.

本当に今は学校のことを全然やってません. 先に言った連続系アルゴリズム演習だけ、それにあわせて座学の方の 連続系アルゴリズムだけ、楽しいです.