シンボルが常に特定の値を表し、プログラムの実行中に変更できないことを宣言するにはどうすればよいですか?
4 に答える
私の知る限り、これはSchemeでは不可能です。そして、すべての意図と目的のために、それは厳密に必要というわけではありません。通常の変数のようにトップレベルで値を定義するだけで、変更しないでください。覚えやすくするために、これらの種類の定数に名前を付けるための規則を採用できます。トップレベルの変数が*stars*
その名前の周りで定義されている本を見てきました。
他の言語では、一部のライブラリが作成した定義を上書きする危険性があります。ただし、Schemeの字句スコープとPLTのモジュールシステムを組み合わせることで、これが発生することはありません。
PLT スキームでは、独自のモジュールに定義を記述します。独自のコードで「set!」を使用していない場合、バインディングは決して変更できません。実際、コンパイラはこれを使用してさまざまな最適化を実行するため、これは単なる規則ではありません。
定数に評価されるマクロを定義できます。これにより、次の単純な使用から保護されます。set!
(define-syntax constant
(syntax-rules ()
((_) 25)))
次に(constant)
、どこでも使用します。これは、*一定*よりも入力するだけです。
私が考えた非常にハックな答えは、定数を返すリーダー マクロを定義することでした。
#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