2010-07-12 66 views
1

如何實現我們在Scheme中的(local ...)語法中定義的變量? 例如,在下面這段代碼,在Scheme環境中實現本地語法中的變量

(define (erkan x) 
    (local 
     ((define y 10)) 
     (* x y))) 

我怎麼能直接拿到y的值?

+1

我不明白你的問題。你在那裏得到'y'的值 - 這就是'x'乘以10的方式。你的意思是你想要在函數之外訪問'y'嗎? – Chuck 2010-07-12 23:38:43

+0

是的,確切地說。我想在功能外使用y- 編輯:得到了答案。我錯過了這個概念,畢竟它是「本地的」。 :P – erkangur 2010-07-12 23:42:21

回答

1

要麼這是一個奇怪的問題,或者你沒有句話是正確的......你的代碼示例使用y,所以它可以訪問它。也許你正在試圖獲得的y只值:

(define (erkan x) (local [(define y 10)] y)) 

或者,也許你想創造一種「對象的事」 - 這是可能的,但涉及到更先進的代碼。下面是一個簡單的例子,只是爲了告訴你它是如何完成的(但如果你正在通過HtDP,最好稍後再離開)。

(define (erkan x) 
    (local [(define y 10) 
      (define (handler message) 
      (cond 
       [(eq? message 'get-x) x] 
       [(eq? message 'get-y) y] 
       [(eq? message 'compute) (* x y)] 
       [else (error "bad message")]))] 
    handler)) 
(define some-erkan (erkan 3)) 
(some-erkan 'get-x) 
(some-erkan 'get-y) 
(some-erkan 'compute) 

(注順便說一句,這是不妥當的方案,但在HTDP使用的教學學生的方言。)

+0

是的,學習HtDP。 當我打電話(erkan 3)時,結果是(lambda(a1)...)在DrScheme中。這很有趣(: 這種方法的名字是什麼?也許我可以從這本書看它 – erkangur 2010-07-12 23:53:27

+0

這是最好的,只是隨書一起順序 - 它也將涵蓋一些更先進的東西,並且以某種方式比一些隨機的代碼更容易理解...... – 2010-07-13 00:05:49

2

訪問y當你在做(* x y)

如果您想從local -block外部訪問y,則不能這樣做。 local - 塊中的任何定義對於該塊都是本地的,並且不能從外部訪問。