我最近碰到了一个玩具例子,让我有点困惑。假设我定义了一个简单的变量函数,如下所示。那么,我们完全有权利在一个论点和两个论点上运行这个问题。
(define (my-func . a) a)
(my-func 1) ; evals to '(1)
(my-func 1 2) ; evals to '(1 2)我遇到的奇怪之处是,如果我试图使用values一次传递多个参数,如下所示:
(my-func (values 1 2))我希望这与(my-func 1 2)的计算结果相同,但却抛出了一个不匹配的错误,即它需要一个参数,但得到了2个参数。
如果my-func是可变的,它为什么要期待一个参数?这与作为参数的句法对象的数量有关还是与其他因素有关?
发布于 2021-01-24 19:09:48
在Racket中,values构造多个返回值(通常是缩写)。作为多个值或值)。除单个值的情况外,不能将值作为参数传递。值不能保存在变量中。当从函数返回时,以及在诸如define-values等形式中使用时,值通常是有用的。有关更多细节,请参见球拍参考的本节。
要使用上述链接中的术语,(my-func [])是只接受单个值的延续。这就是为什么在您的程序中,它错误的消息“期望一,得到二”。
你想要做的事情可以用call-with-values来完成
(call-with-values (lambda () (values 1 2)) my-func)发布于 2021-01-26 22:54:46
或做:
(let-values [(a b) (values 1 2)]
(my-func a b))不幸的是,不能将变量数量的值捕获到一个变量中。
https://stackoverflow.com/questions/65873698
复制相似问题