blog/content/post/2008/08/28/2008-08-28-00001013.md

5.9 KiB
Raw Blame History

title author date url wordtwit_post_info categories
手続き中の引数の書き方がわからないかもしれない kazu634 2008-08-28 /2008/08/28/_1089/
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";}}
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はどこに消えたのというか引数は一つだけではなんで複数個の引数がありなわけ