たとえば、((fn-stringappend string-append) "a" "b" "c")
私はこれを処理する方法を知っています(f x y z)
。しかし、不明な数のパラメーターがある場合はどうなりますか?この種の問題を処理する方法はありますか?
22401 次
2 に答える
34
スキームでは、ドット表記を使用して、可変数の引数( varargsまたは可変個引数関数とも呼ばれます)を受け取るプロシージャを宣言できます。
(define (procedure . args)
...)
の中procedure
にargs
は、0個以上の引数が渡されたリストがあります。このように呼んでください:
(procedure "a" "b" "c")
@Arafinweが指摘しているように、匿名プロシージャの同等の表記法は次のとおりです。
(lambda args ...)
このように呼んでください:
((lambda args ...) "a" "b" "c")
サイズが不明なリストのパラメーターを可変個引数関数に渡す必要がある場合は、次のように記述できることに注意してください。
(apply procedure '("a" "b" "c"))
(apply (lambda args ...) '("a" "b" "c"))
アップデート:
コメントのコードに関しては、これは意図したとおりに機能しません。
(define (fp f)
(lambda (.z)
(f .z)))
私はあなたがこれを意味したと信じています:
(define (fp f)
(lambda z
(apply f z)))
糖衣構文を少し使用すると、上記の手順をさらに簡略化できます。
(define ((fp f) . z)
(apply f z))
しかし、それは単に書くための長い道のりです。
(apply f z)
これはあなたが必要なものですか?
(apply string-append '("a" "b" "c"))
とにかくそれは次と同等だからです:
(string-append "a" "b" "c")
string-append
すでに0個以上の引数を受け取っています(少なくとも、Racketの場合はそうです)
于 2012-09-30T03:40:56.067 に答える
7
ÓscarLópezの答えに加えて、次のように変数引数の無名関数を作成することもできます。
(lambda args ...)
ここでも、の中にlambda
は、args
渡された引数のリストがあります。
于 2012-09-30T04:04:30.353 に答える