For loop for循环中的多个绑定
因此,Racket(6.5)文档说您可以一次绑定多个ID:For loop for循环中的多个绑定,for-loop,racket,For Loop,Racket,因此,Racket(6.5)文档说您可以一次绑定多个ID: (for ([(i j) #hash(("a" . 1) ("b" . 20))]) (display (list i j))) Bu-u-ut我想不出/找不到如何使用手动构造的数据执行此操作的示例: (define a '(1 2 3 4 5)) (define b '(10 20 30 40 50)) (for ([(i j) (map list a b)]) (display (list i j))) 爆发 r
(for ([(i j) #hash(("a" . 1) ("b" . 20))])
(display (list i j)))
Bu-u-ut我想不出/找不到如何使用手动构造的数据执行此操作的示例:
(define a '(1 2 3 4 5))
(define b '(10 20 30 40 50))
(for ([(i j) (map list a b)])
(display (list i j)))
爆发
result arity mismatch;
expected number of values not received
expected: 2
received: 1
from:
in: local-binding form
values...:
我缺少什么?在本例中,您可以使用单独的子句来绑定
I
和j
:
(for ([i (list 1 2 3 4 5)]
[j (list 10 20 30 40 50)])
(display (list i j)))
一般来说,您可以并行使用
从多个单值序列创建多个值的单序列:
(for ([(i j) (in-parallel (list 1 2 3 4 5)
(list 10 20 30 40 50))])
(display (list i j)))
这两种解决方案都打印了(110)(220)(330)(440)(550)
(for ([(i j) #hash(("a" . 1) ("b" . 20))])
(display (list i j)))
是的缩写
(for ([(i j) (in-hash #hash(("a" . 1) ("b" . 20)))])
(display (list i j)))
(for ([(i j) (in-list (map list a b))])
(display (list i j)))
现在,hash中的一次返回两个值,因此(ij)
将绑定到这两个值
另一方面,这:
(for ([(i j) (map list a b)])
(display (list i j)))
是的缩写
(for ([(i j) (in-hash #hash(("a" . 1) ("b" . 20)))])
(display (list i j)))
(for ([(i j) (in-list (map list a b))])
(display (list i j)))
列表中的将一次返回一个元素(在您的示例中)
元素是一个列表)。因为(i j)
不仅是一个,还发出错误信号
同时遵循弓形虫在中的建议
更新
下面的帮助程序生成值序列
显示
如何创建一个自定义序列,重复
生成多个值
#lang racket
(define (make-values-sequence xss)
; xss is a list of (list x ...)
(make-do-sequence (λ ()
(values (λ (xss) (apply values (first xss))) ; pos->element
rest ; next-position
xss ; initial pos
(λ (xss) (not (empty? xss))) ; continue-with-pos?
#f ; not used
#f)))) ; not used]
(for/list ([(i j) (make-values-sequence '((1 2) (4 5) (5 6)))])
(+ i j))
输出:
'(3 9 11)
有没有什么特别的方法可以直接编写兼容的“一次两个值的序列”(以(列表(列表1 2)…
的方式)而不是并行地“重新排列这两个单值序列并给我一个不透明的#
”?