2009-06-24 57 views

回答

8

據我所知,這在Scheme中是不可能的。而且,對於所有意圖和目的,這不是絕對必要的。只需像常規變量那樣在頂層定義值,然後不會更改它。爲了幫助你記住,你可以通過一個約定來命名這些常數 - 我已經看到書籍的頂層變量是用*stars*圍繞它們的名字來定義的。

在其他語言中,有些庫會覆蓋您創建的定義。然而,Scheme的詞彙範圍界定與PLT的模塊系統相結合確保了這一點永遠不會發生。

+7

在Common Lisp中,通常* stars *用於頂層變量,+ plus-signs +用於常量。 – Svante 2009-06-24 01:46:44

+0

我不在Lisp中編程,我一直想知道*約定。感謝您清除它。 – unj2 2009-06-24 03:29:01

2

您可以定義計算結果爲常量的宏,這將保護您免受簡單的用途set!

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

然後你只需要使用(constant)無處不在,這是不超過打字*不變*

5

在PLT方案中,您可以將自己的定義寫入自己的模塊中 - 如果您自己的代碼不使用`set!',那麼綁定永遠不會改變。事實上,編譯器使用它來執行各種優化,所以這不僅僅是一個約定。

,我認爲的
1

一個真正的hackish的解決辦法是定義一個讀者宏,返回你的常數:

#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