首页 文章

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

提问于
浏览
1

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

  • 1

    我们有标准的词法封闭 . 例如 . 我们可以做一个咖喱程序:

    (define (curry proc arg)
      (lambda args
        (apply proc arg args)))
    
    (define add-10 (curry + 10))
    (add-10 5) ; ==> 15
    

    如果要动态更改值 . 例如 . 您可以通过在调用变量时设置变量来更改一个过程的行为 . 使用parameters#!racket 中提供了动态变量 . 这是一个例子:

    #!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)
    

相关问题