Jan 14 2013

This says "More Use Me!"

お題: 「手を切断した人が、無いはずの手に痛みを感じるように」 答例: 無いはずの2013年に非日常を感じてる

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

(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

めでたしめでたい