--- title: 手続き中の引数の書き方がわからないかもしれない author: kazu634 date: 2008-08-28 url: /2008/08/28/_1089/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4239;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - Lisp ---

プログラミングGauche』を再度読み直しているところ。わかっていないところが多い。とりあえず手続き中の引数の書き方はオーソドックスなのは次の二つのパターン:

(define plus2_1
(lambda (arg) (+ arg 2)))
(define (plus2_2 arg)
(+ arg 2))

こう宣言することで

gosh> (plus2_1 5)
7
gosh> (plus2_2 5)
7

となる。ここで76-7ページあたりの記述を見てみる。「受け取った引数を出力してから、任意の手続きを実行する手続き」としてmake-loggerが紹介されている。

(define (make_logger func)
(lambda args
(print "args=" args)
(apply func args)))
(define my_append_log (make_logger append))

自分の理解だとこのmake_loggerは「(make_logger 手続き名 引数」とかが十分通用しそうに思っていた。けど、「引数は一つだ!」と怒られる。

gosh> (make_logger print '(1 2 3))
*** ERROR: wrong number of arguments for #<closure make_logger> (required 1, got 2)
Stack Trace:
_______________________________________
gosh> (make_logger append '(1 2 3) '(1 2 3))
*** ERROR: wrong number of arguments for #<closure make_logger> (required 1, got 3)
Stack Trace:
_______________________________________
gosh> (make_logger append)
#<closure (make_logger make_logger)>
gosh> (make_logger)
*** ERROR: wrong number of arguments for #<closure make_logger> (required 1, got )
Stack Trace:
_______________________________________

うでも、これは大丈夫。

gosh> (my_append_log '(1 2 3) '(4 5 6))
args=((1 2 3) (4 5 6))
(1 2 3 4 5 6)

(make_logger)の宣言中のlambdaはどこに消えたの?というか引数は一つだけでは?なんで複数個の引数がありなわけ?