【问题标题】:Declaring local variable in function from another list从另一个列表中声明函数中的局部变量
【发布时间】:2016-06-09 09:50:06
【问题描述】:

我正在尝试根据另一个列表中的给定值定义一个元素

  (define foo   ; not working but this is general idea
    (λ (x ys)
      (for/list ([y ys])
        (if (eq? x (car y))
            (let ('x (cdr y))
              (boolean? x))  ; x not passed, returns #f
            '()))))   ; or use x to do something like (eval ('and x #t))

期望的输出:

>(foo 'a '((a . true) (b . false)))
#t

显示 (cdr y) 的布尔值实际上传递到 x (只是我正在尝试的一个示例)

算法 - 搜索ys,其中ys 中每个元素的(car y) 等于a,并将布尔值(cdr y) 设置为a。所以上面的x 应该有布尔值#t

不太明白为什么它不起作用。

【问题讨论】:

  • 表达式(let ('x (cdr y)) ...) 的机器解释含义可能与您的意思大不相同。它等价于(let ([quote x] [cdr y]) ...),即让quote = x 并让cdr = y。您可能指的是(let ([x (cdr y)]) ...),它表示让x = (cdr y)。你是这个意思吗?

标签: scheme racket let


【解决方案1】:

我正在尽我所能理解您的问题,但您的目标是什么并不完全清楚。

看起来您正在尝试返回单个 #t/#f 值,但如果您查看 documentation 中的 for/list,您会发现它始终会返回一个列表。

让我们试试这样的方法

(define (foo x ys)
  (let loop ([ys ys])
    (cond [(empty? ys) '()]
          [(eq? x (caar ys)) (cdar ys)]
          [else (loop (cdr ys))])))

(foo 'a '((a . true) (b . false))) ;=> 'true
(foo 'b '((a . true) (b . false))) ;=> 'false

但是,如果您想将'true 转换为#t'false 转换为#f,您可以添加一个这样的辅助函数

(define (bool x)
  (eq? 'true x))

(define (foo x ys)
  (let loop ([ys ys])
    (cond [(empty? ys) '()]
          [(eq? x (caar ys)) (bool (cdar ys))]
          [else (loop (cdr ys))])))

(foo 'a '((a . true) (b . false))) ;=> #t
(foo 'b '((a . true) (b . false))) ;=> #f

【讨论】:

  • 谢谢,我刚刚发现有一个dict-ref,这正是我所需要的。
猜你喜欢
  • 2012-05-23
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多