从另一个列表中声明函数中的局部变量

时间:2016-02-26 08:56:02

标签: scheme racket let

我试图根据另一个列表中的给定值来定义元素

  (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中搜索(car y)中每个元素的ys等于a,并将布尔值(cdr y)设置为{{1} }}。所以上面的a应该有布尔x

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

1 个答案:

答案 0 :(得分:2)

我尽力了解您的问题,但目标并不完全清楚。

您似乎正在尝试返回单个#t / #f值,但如果您查看for/list的{​​{3}},那么您就是&#39 ; ll看到它总会返回一个列表。

让我们试试这样的事情

(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