12

一部の関数ができるように、キーワード引数を受け入れることができる構文形式を Racket で作成したいと考えています。

簡単な例に減らして、次のように書いてみました。

(define-syntax sum-of-products
  (syntax-rules (#:extra)
    [(sum-of-products ([a b] ...))
     (+ (* a b) ...)]
    [(sum-of-products ([a b] ...) #:extra extra)
     (+ extra (* a b) ...)]))

以下が機能するように:

(sum-of-products ([2 2] [3 3])) → 13
(sum-of-products ([2 2] [3 3]) #:extra 5) → 18

残念ながら、Racket はこれを「不適切な構文」と呼んでいるため、明らかにその試みは正しくありませんでした。

これはできますか?

4

1 に答える 1

15

構文パターンのキーワードは、数値などのリテラルと同じように扱われるため、キーワードとして指定する必要はありません。(これは識別子にのみ必要です。) したがって、次のように動作します (2 番目の例でのタイプミスを修正したことに注意してください)。

#lang racket
(define-syntax sum-of-products
  (syntax-rules ()
    [(sum-of-products ([a b] ...))
     (+ (* a b) ...)]
    [(sum-of-products ([a b] ...) #:extra extra)
     (+ extra (* a b) ...)]))
(sum-of-products ([2 2] [3 3]))
(sum-of-products ([2 2] [3 3]) #:extra 5)

キーワードの解析を容易syntax-parseにするユーティリティについても参照してください。

于 2012-04-10T18:38:50.273 に答える