使用未作为参数的参数定义函数[Racket]

时间:2015-04-21 18:58:07

标签: racket

我想在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

1 个答案:

答案 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)