程序“值”

时间:2018-01-14 16:17:18

标签: scheme

在回答他自己的问题“我的代码发出错误信号”申请时:1月2日没有程序“或”调用非程序“sylwester”显示了这个例子

(define (abs x)
       ((if (< x 0) - values) x))

我不明白MIT / Gnu-Reference for scheme中程序“值”的解释。我在想,为什么 (显示(值1 2 3)) 给出

[编译闭包23(全局#x3b)#x7b#x1845c93#x324eaa8]

;未指定的返回值

2 个答案:

答案 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没有复制这个功能,因为divdiv-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