26

たとえば、((fn-stringappend string-append) "a" "b" "c") 私はこれを処理する方法を知っています(f x y z)。しかし、不明な数のパラメーターがある場合はどうなりますか?この種の問題を処理する方法はありますか?

4

2 に答える 2

34

スキームでは、ドット表記を使用して、可変数の引数( varargsまたは可変個引数関数とも呼ばれます)を受け取るプロシージャを宣言できます。

(define (procedure . args)
  ...)

の中procedureargsは、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 に答える