2010-07-12 64 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 - 块中的任何定义对于该块都是本地的,并且不能从外部访问。