我对计划很新,我对如何解决这个问题有些不确定。
我试图创建一个接受许多参数的过程,一个是一个过程。截至目前,我收到错误,因为变量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作为参数并在调用期间传递它,但出于其他原因我想尝试避免这样做,除非没有其他解决方案。
感谢任何想法!
答案 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”的变量的绑定范围内。
也许您应该告诉我们更多关于您要做的事情......
(编辑:我应该补充说,有大约一百万种不同的方法可以解决这个问题;几乎可以肯定的是,这种方法可以满足您的需求。我并不是说听起来很消极。)