--- 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はどこに消えたの?というか引数は一つだけでは?なんで複数個の引数がありなわけ?