在Scheme环境中以本地语法实现变量

时间:2010-07-12 23:26:37

标签: scheme racket local-variables

我们如何实现我们在Scheme中(local ...)语法中定义的变量? 例如,在下面的代码中,

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

如何直接获取y的值?

2 个答案:

答案 0 :(得分:2)

当您y时,访问(* x y)

如果您想从y块之外访问local:您无法执行此操作。在local - 块内所做的任何定义都是该块的本地定义,不能从外部访问。

答案 1 :(得分: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)

(注意BTW,这不是正确的方案,而是在HtDP中使用的教学方言。)