2017-05-10 2 views
1

私は私がmetacircular評価で働いているこの作業を持っている、と私はこのような新しいcondを定義します。なぜ私は新しいcondを定義できますか?そして、Schemeは条件condに対して新しいcondと混同されませんか?

(define cond 3) 

と同様にelseを:これを行う理由

(define (else x) (/ x 2) 

私の質問は(下)実際に動作しますか?

(cond ((= cond 2) 0) 
(else (else 4))) 

どのスキームでは、条件付きcondelse上で、私の定義された指揮と私のelseあるcond知っているのですか?

(私は私の質問を定式化するかどうかはわかりませんとして、タイトルを編集する自由を感じる)

+1

少なくとも、ラケットでは間違いありません。 'cond'と' else'の両方の識別子は新しい定義に束縛されており、式は '3'を手続きとして適用しようとすると例外をスローします。 –

+0

それはどこで機能しますか?私が知る限り、どのScheme実装でも動作しません。 – molbdnilo

答えて

1

それはあなたがmetacircular評価でcondを実装しているかに依存します。通常、それはquotecondのような記号をいくつかの演算子をチェックして、何か特別なことをします。したがって、オペレータ位置にあるcondcondと展開されますが、condはそれが変数であるかのように評価されます。

1

スキームで予約済みの識別子はありません。多くの言語では、変数の名前として使用できない予約済み識別子(キーワード)のリストがあります。

スキームでは、たとえば、これを行うことができます。ほとんどの言語から

離れてスキームを設定し、どのような
> (let ((cond +)) 
    (cond 1 2)) 
3 

は、プログラムが展開するマクロであるということです。 Schemeプログラムを実行

read -> macro expansion -> compilation -> execution 

それはマクロ展開アルゴリズムがどのように機能するかを説明するために、非自明です。 R. Kent Dybvigの "Syntactic Abstraction:The syntax-case expander"の章を "Beautiful Code"という本でお勧めします。

https://www.cs.indiana.edu/~dyb/pubs/bc-syntax-case.pdf

関連する問題