2

最近 ChickenScheme の使用を開始しましたが、デフォルトの引数 (指定されていない場合) を使用して関数を宣言したいと考えています。Racket のサイトでこの例を見つけました。Racket と ChickenScheme が異なることは知っていますが、基本的なことは同じだと思いました。

(define greet
  (lambda (given [surname "Smith"])
    (string-append "Hello, " given " " surname)))

これは ChickenScheme インタープリターからのエラーです。

Error: during expansion of (lambda ...) - in `lambda' - lambda-list expected: (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname))

Call history:

<syntax>      (define greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)))
<syntax>      (##core#set! greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)))
<syntax>      (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname))    <--
4

2 に答える 2

5

単純な Scheme では、末尾のドット表記を使用して追加の引数のリストを取得し、このリストを検査して追加の引数が提供されたかどうかを確認できます。

(define greet
   (lambda (given . rest)
     (let ((surname (if (pair? rest) (car rest) "Smith")))
       (string-append "Hello, " given " " surname))))

これはあまり便利ではないため、さまざまな Scheme システムがさまざまな代替手段を提供しています。CHICKEN では、DSSSL アノテーションがサポートされているため、次のことができます。

 (define greet
   (lambda (given #!optional (surname "Smith"))
     (string-append "Hello, " given " " surname)))
于 2016-07-10T19:36:07.683 に答える
3

Racket のオプション引数の構文は実際には非標準であるため、他のインタープリターがそれを実装するとは思わないでください。スキームでは、標準機能は RxRS スキーム レポートで定義されている機能であり、R7RSが最新のものです。しかし、恐れる必要はありません - Chicken Scheme では、以下を使用できますoptional

[syntax] (optional ARGS DEFAULT)

オプションの引数を 1 つ取るプロシージャには、この形式を使用します。ARGS が空のリストの場合、DEFAULT が評価されて返されます。それ以外の場合は、リスト ARGS の最初の要素が返されます。ARGS に複数の値が含まれていると、エラーになります。

次のように使用します。

(define (greet given . surname)
  (string-append "Hello, " given " " (optional surname "Smith")))
于 2016-07-10T19:33:49.063 に答える