2009-06-24 12 views

答えて

8

私が知る限り、これはSchemeでは不可能です。そして、すべての目的と目的のために、それは厳密に必要ではありません。トップレベルの値を通常の変数のように定義してからに変更しないでください。あなたが覚えておくために、これらの定数の命名規則を採用することができます。トップレベルの変数がその名前の周りに*stars*で定義されている本を見ました。

他の言語では、作成した定義を一部のライブラリが上書きする危険性があります。しかし、SchemeのレキシカルスコープとPLTのモジュールシステムを組み合わせることで、これは決して起こりません。

+7

Common Lispでは、通常は* stars *がトップレベル変数に使用され、+ plus-signs +が定数に使用されます。 – Svante

+0

私はLispでプログラムを使っていませんでした。それをクリアしていただきありがとうございます。 – unj2

2

あなたは次に、あなただけの

5
*定数*以下でタイピングではありませんこれは、どこにでも (constant)を使用 set!

(define-syntax constant 
    (syntax-rules() 
    ((_) 25))) 

の簡単な用途に対してあなたを保護する定数に評価するマクロを定義することができ

PLT Schemeでは、独自のモジュールに定義を書きます。自分のコードが `set! 'を使用していない場合、バインディングは決して変更できません。実際、コンパイラはこれを使用してさまざまな最適化を実行するため、これは単なる慣習ではありません。

+0

あなたがstackoverflowで聞いてくれてよかったよ。 – unj2

1

私は考え本当にハック答えはあなたの定数を返すリーダーマクロを定義することでした:

#lang racket 
(current-readtable 
    (make-readtable (current-readtable) 
        #\k 'dispatch-macro (lambda (a b c d e f) 5))) 

#k ;; <-- is read as 5 

その後、(読者のマクロを変更せずに)これを再定義することは不可能であろう:

(set! #k 6) ;; <-- error, 5 is not an identifier 
関連する問題