2016-09-01 6 views
1

私は今夏、ラケットでおもちゃの言葉を作って遊んだことがあります。すべてのフォームは固定されたアリティを持ち、デフォルトで適用されるので、かっこは必要ありません。例えば。 +は2を有するので、+ 3 + 4 5(+ 3 (+ 4 5))であり、+ + 3 4 5(+ (+ 3 4) 5)である。読み取り時にモジュールに関する情報を取得する方法はありますか?

これを行うには、メインモジュールにシンボルとそのア​​リティを格納します。読者はそれが特別な形式か手続きかどうかは気にしませんが、ラケットの機能を使ってこれを行うより良い方法がありますか?したがって、私はモジュールのメタデータをインポートし、代わりにそれを構文解析中に照会できますか?

+0

こんにちは。 「読者は気にしていないかどうかは気にしない」「それ」とは何か? メタデータの格納はサブモジュールで行われることがよくあります(ただし、どこで(いつ)!)メタ情報を使用したいのですか? – soegaard

+0

@soegaardリーダのシンボルは、結果の構文の識別子になりますもし私がラケット/ベースの新しい構文を作っていたら、何とかラケット/ベースで "cons"を探して、それがアリティであることを見つけることができますか? – Sylwester

+0

あなた自身のリーダーを書いていますか、それとも内蔵のものを再利用していますか? – soegaard

答えて

1

ここからシンボルからアリティへ行く方法の1つです。

#lang racket 

(define base-ns (make-base-namespace)) 
(define (symbol->arity s) 
    (parameterize ([current-namespace base-ns]) 
    (procedure-arity (namespace-variable-value s)))) 

(symbol->arity 'cons) 
+2

非常に良い。私が 'racket/list'のような特定のモジュールを見るだけであれば、どうすればそれだけの名前空間を作ることができますか? – Sylwester

+0

make-empty-namespaceを使用して名前空間を作成します。次に、namespace-requireを使用してモジュールを要求します。 – soegaard

+0

私が試したことはありますが、惨めに失敗しましたが、私は[ここ](https://docs.racket-lang.org/guide/mk-namespace.html)で 'make-base-empty-namespace'が正しいオプション。この週末のようなものはすべて名前空間に関するものです。ありがとう:) – Sylwester

関連する問題