传递具有当前未定义变量的过程以供稍后使用 - Scheme

时间:2018-02-09 00:27:36

标签: scope scheme

我对计划很新,我对如何解决这个问题有些不确定。

我试图创建一个接受许多参数的过程,一个是一个过程。截至目前,我收到错误,因为变量x在过程范围内被视为未定义。这是一个简化的设置:

(define (test procedure1 x)
    (define (innerTest y)
        (if (procedure y) 1 2)))

以下是程序:

(define (procedure1 y)
    (+ x y)) 

运行以下内容会给我错误" x:undefined;不能引用未定义的标识符"

(test procedure1 x)

我很确定我知道问题在于,在传递过程的范围内,x是不可见的,但我不确定解决方案是什么。

我意识到简单的解决方法就是让procedure1接受x作为参数并在调用期间传递它,但出于其他原因我想尝试避免这样做,除非没有其他解决方案。

感谢任何想法!

2 个答案:

答案 0 :(得分:1)

程序的正式参数将影响早期范围:

(define (test +)
  (+ 2 3))

(test -)
; ==> -1

我给参数命名+的事实没有任何价值。这只是一个名字。通过选择一个以前已知的名称,你得到的唯一真正的副作用是你遮蔽它,使得它们不能同时共存。

正如您所看到的,您传递的内容与形式参数的名称无关。

(define (proc y)
  (+ x y)) ; x and + are not bound so they're free/global

(define x 20) ; this is x
(proc 10) ; ==> 30

任何不在词汇范围内的自由变量当然是全局的。您可以在变量之前创建过程,但在定义proc之前无法运行x

从您的问题来看,它看起来像是尝试了一些应用:

(define (partial proc value)
  ;; this procedure returns a procedure
  (lambda args
    (apply proc value args)))

;; how it's used
(define add10 (partial + 10))
(add10 5) ; ==> 15

答案 1 :(得分:0)

与您可能遇到的任何其他编程语言一样,Scheme也有所谓的“词法范围”。也就是说,特定变量的绑定是由程序的形状静态确定的。

因此,任何名为“x”的变量的使用必须出现在名为“x”的变量的绑定范围内。

也许您应该告诉我们更多关于您要做的事情......

(编辑:我应该补充说,有大约一百万种不同的方法可以解决这个问题;几乎可以肯定的是,这种方法可以满足您的需求。我并不是说听起来很消极。)