我想在Racket中定义函数,该函数使用未作为参数给出的参数,但将在范围中定义。这可能吗?
例如,
(define (fun1 x) (get-value x data))
(define (another-function args . data)
... (map (eval '((fun1 . x) (fun2 . y)))) ...
)
fun1
需要引用数据结构,但它将作为参数提供给fun1
将被调用的函数
我对Racket没有经验,无法在网络上找到我的问题的解决方案。很抱歉给您带来不便,感谢您的回复。
编辑:
我应该给出一个更准确的解释。
关键是,我不使用像struct
这样的数据结构。相反,我给出一个包含数据的列表,对其应用一些更改,并返回更新的数据。
有问题的部分是,因为我的数据是作为参数给出的,当我在其他地方定义一个函数时我不能使用这个数据因此我得到unbound identifier
的错误
代码段:
(define (var x) (get-value x data)) ;Should return value of x from data
;Error due to previous part: "unbound identifier in module in: data"
(define (myapply func expr data) (eval (cons(func (map (eval expr))))))
> (myapply '+ '((var x) (var y)) '((x 3) (y 4)))
7
答案 0 :(得分:1)
我们有标准的词法闭包。例如。我们可以做一个咖喱程序:
(define (curry proc arg)
(lambda args
(apply proc arg args)))
(define add-10 (curry + 10))
(add-10 5) ; ==> 15
如果要动态更改值。例如。您可以通过在调用变量时设置变量来更改一个过程的行为,它可以控制动态变量。 #!racket
使用parameters提供了动态变量。这是一个例子:
#!racket
(define p (make-parameter 10))
(define (list-3-p)
(let ((p-val (p)))
(list p-val p-val p-val)))
(define (override-p-parameter new-val thunk)
(parameterize ([p new-val]) ; we override p momentarily to a new value
(thunk))) ; but it restores to it's initial value after
(list-3-p) ; (10 10 10)
(override-p-parameter 20 list-3-p) ; (20 20 20)
(list-3-p) ; (10 10 10)
如果p
是正常的词汇变量,那么这将不起作用:
#!racket
(define p 10)
(define (list-3-p)
(let ((p-val p))
(list p-val p-val p-val)))
(define (override-p-parameter new-val thunk)
(let ([p new-val]) ; we override p momentarily to a new value
(thunk))) ; but it won't change `p` in thunk because of lexical scoping.
(list-3-p) ; (10 10 10)
(override-p-parameter 20 list-3-p) ; (10 10 10)
(list-3-p) ; (10 10 10)