2011-01-14 81 views
0

我目前使用Drracack作爲一些探索性編程的編輯器的球拍計劃。當我嘗試並重新定義一個函數,我得到了以下信息:球拍計劃重新定義常量

define-values: cannot re-define a constant: png->byte-list 

現在我來接受,這是語言的屬性,被它挫敗,但那種接受了它。讀了How can you re-define a constant identifier in DrScheme?我可以看到我不一定要接受這個限制。

我的問題如下:

  1. 只在R5RS語言提供這個功能嗎?有沒有辦法爲任意語言切換此功能?
  2. 或者,如果我切換R5RS語言,這會對我使用目前使用的模塊產生影響:racket/gui/base和web-server/insta?

回答

4

如果您在定義窗口中執行這些重定義,則可以使用#lang racket。要記住的一點是,這是不是一個一種突變的(這是常見的有R5RS實現),例如,這樣的:

#lang racket 
(define orig-+ +) 
(define + whatever) 

不會有orig-+綁定到真正的新增功能。當編譯這個模塊時,Racket知道(靜態地)+是你定義的東西,所以任何對它的引用都是對你自己定義的引用 - 所以上面的代碼將orig-+綁定到+的「未初始化」值。如果你真的想要做這樣的事情,那麼你可以要求原+下一個不同的名稱:

#lang racket 
(require (rename-in racket [+ orig-+])) 
(define + whatever) 

最重要的是,有內聯發生這種情況時,該模塊編譯 - 這是一個不同的問題。球拍通常希望內聯引用在代碼中從不變化的綁定,因此如果您嘗試最後一段代碼,您將無法在REPL上進一步重新定義+。您可以處理,在以下兩種方式之一 - 第一個是突變明確的結合:

#lang racket 
(require (rename-in racket [+ orig-+])) 
(define + #f) 
(set! + whatever) 

這使編譯器避免任何內聯。另一個選項是DrRacket標誌,它打開一個避免所有內聯的編譯器標誌。請注意,對此的速度懲罰可能很大。

+0

當您說DrRacket標誌時,是否指R5RS語言的標誌? – 2011-01-15 06:52:34

0

1 - 我不是pro中的pro,但我試圖重新定義乘法函數(*)。 它不適用於「禁止重新定義初始綁定」。但是,如果不加以控制 - 它的工作原理:

Welcome to DrRacket, version 5.0.2 [3m]. 
Language: R5RS [custom]; memory limit: 128 MB. 
> (* 2 2) 
4 
> (define (* a b) a) 
> (* 2 2) 
2 
> 

但是,我不能讓你的錯誤(定義值:不能重新定義一個常數:...) 如果我重新定義現有功能我得到(定義值:不能更改常量變量:...)

2 - 我會認爲,如果模塊具有#lang指令,明確指定語言,它不應該是一個問題(我猜)。

0

下面是如何定義乘法

(定義乘*);名爲「multiply」的變量值爲*