在回答他自己的问题“我的代码发出错误信号”申请时:1月2日没有程序“或”调用非程序“sylwester”显示了这个例子
(define (abs x)
((if (< x 0) - values) x))
我不明白MIT / Gnu-Reference for scheme中程序“值”的解释。我在想,为什么 (显示(值1 2 3)) 给出
;未指定的返回值
答案 0 :(得分:0)
values
作为身份功能:
(values 5) ; ==> 5
((lambda (v) v) 5) ; ==> 5
现在values
还允许除一个值以外的其他值。如果您执行(values 4 5)
,则会发送两者。
如果你做(display expression)
那么display
将是表达式的延续,它只接受一个参数而(values 1 2 3)
将通过它3.对于R5RS,它将是无效的Scheme代码和因此,虽然报告建议有一个明智的错误信息,但是实施可以自由地做他们喜欢的事情。实际上,这为实现特定和不可移植的功能开辟了道路。
以下是使用values
而不是一个参数的示例:
;; returns the max and min value from the list with at least one element.
(define (min-max lst)
(let loop ((lst (cdr lst)) (min-value (car lst)) (max-value (car lst)))
(if (null? lst)
(values min-value max-value)
(let ((a (car lst)))
(loop (cdr lst) (min min-value a) (max max-value a))))))
(min-max '(1 2 3 4 5 6))
; ==> 1
; ==> 6
;; sums the max and min object from the list
(define (sum-min-max lst)
(let-values (((min max) (min-max lst)))
(+ min max)))
(sum-min-max '(1 2 3 4 5 6))
; ==> 7
Scheme具有返回多个值的函数。一个例子是div-and-mod
in the R6RS:
(div-and-mod 13 5)
; ==> 2
; ==> 3
在Scheme中,接收函数需要支持参数的数量,而在CL中,不是句柄的多值结果是句柄,就像它只返回第一个值一样。
(print (values 1 2 3))
; ==> 1 (as side effect it prints 1)
我一直想知道为什么Scheme没有复制这个功能,因为div
和div-and-mod
都计算CPU中的余数,所以它们本质上是相同的,除了它有多少个值回报。 CL等价物只有一个函数,您可以选择在单值上下文中使用它。
答案 1 :(得分:0)
在Gnu / MIT-Scheme中,&#34;值&#34;
有两种用途那,你有什么想法: 参考文献中的一些行:
从第12.4章开始 价值对象。 。 。 [程序] 返回多个值。调用此过程时的有效连续必须是通过call-with-values创建的多值继续。此外,它必须接受与对象一样多的值。
那就是为什么你的例子
(define (abs x)
((if (< x 0) - values) x))
作品。
在14.11.2 * Parser中 价值观表达。 。 。 [解析器表达式] 有时,能够将任意值插入到解析器结果中是有用的。值表达式支持此功能。表达式参数是在运行时计算并在向量中返回的任意Scheme表达式。值表达式总是成功,并且永远不会修改解析器缓冲区的内部指针。
第二个定义的示例,它不起作用
(values 5)
;Value 29: #[compiled-closure 29 ("global" #x3b) #x7b #xf4cc93 #x2b87bc0]
(define (double x)
(* (values x) 2))
(double 5)
;The object #[compiled-closure 27 ("global" #x3b) #x7b #xf4cc93 #x2b69808], passed as the first argument to integer-zero?, is not the correct type.
亲爱的sylwester,谢谢你的努力.1