我试图根据另一个列表中的给定值来定义元素
(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
。
不太明白为什么它不起作用。
答案 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