blog/content/post/2008/08/30/2008-08-30-00001014.md

6.1 KiB
Raw Blame History

title author date wordtwit_post_info categories
Lispの引数についてid:SaitoAtsushiさんにコメントいただいた kazu634 2008-08-29
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:4243;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}
gauche
Lisp

id:SaitoAtsushiさんのおかげで、とりあえずこの部分については理解できた(ありがとうございました>id:SaitoAtsushi)。

仮引数を括弧で囲んで並べた場合、その仮引数の個数分の引数を受けとることになります。 もちろん仮引数の個数を越えて値を渡そうとすればエラーになります。

*1 1)

ですが、括弧で囲んでいない場合には受け取った引数がリストになってひとつの変数に入ります。

*2 1 2 3)

リストになってひとつの変数に収まるので引数の数は不定です。 いくつ渡してもいいわけです。

*3 1 2 3)

*4 1 2 3 4)

*5 1 2 3 4 5)

武蔵の日記

次なる問題は

;; これはオリジナル
(define (make_logger_1 func)
(lambda args
(print "args=" args)
(apply func args)))
;; これもオリジナル
(define my_append_log (make_logger_1 append))
;; 検証用
(define make_logger_2
(lambda (func . args)
(print "args=" args)
(apply func args)))
;; これだと引数が足りないと怒られる
(define my_append_log2
(make_logger_2 apply))
;; 自分なりにmy_append_logをlambdaで書いてみた。
;; でも引数は一つと怒られる
(define my_append_log_2
(lambda (func)
(lambda args
(print "args=" args)
(apply func args))))

ここでやっぱり疑問が。

  • make_logger_1とmake_logger_2は何が違うのかmake_logger_1は手続きを使う側からすると、引数は一つだけになる。make_logger_2は手続きを使う側からすると、「手続きと引数リスト引数の数は不定」を引数として受け取る。

なんとなく、外側からの見え方の違いとmy_append_logの定義をするときのように、「定義するときは第一引数だけを指定したいんだけど、定義する手続き自身(my_append_log)は不定個の引数を受け取らせたい」ときの書き方なのかなでも、それだとmy_append_log2でなんでだめなのかしら

*1lambda (a) (write a

*2lambda a (write a

*3lambda a (write a

*4lambda a (write a

*5lambda a (write a