gpt4 book ai didi

functional-programming - 为什么在函数定义中进行自调用是合法的,但对于值是非法的?

转载 作者:行者123 更新时间:2023-12-04 08:42:47 25 4
gpt4 key购买 nike

计算机程序的结构和解释 (SICP) 3.5.2 引入了无限流:

(define ones
(cons-stream 1 ones))

此代码在 DrRacket 中不起作用,并出现错误:

ones: undefined; cannot reference an identifier before its definition



其他代码如下:
(define (integers-starting-from n)
(cons-stream n
(integers-starting-from (+ n 1))))

(define integers (integers-starting-from 1))

产生错误:

Interactions disabled



(陷入无限循环?)

据我所知(SICP),实现无限流的关键是延迟评估:
(define (delay exp)
(lambda () exp))

(define (cons-stream a b)
(cons a
(delay b)))

与此用于 cons-stream ,无限流仍然是非法的。

这种数据结构让我想起了递归函数,它的定义自调用在实际导出内或没有实际导出时都是合法的(在编译中)。

为什么值引用自身是非法的?连引用都延迟了?

其他编程语言可以支持无限流吗?

如果不是,是否与处理器处理汇编语言的方式有关?数据堆栈的东西?

最佳答案

当您创建一个过程时,参数已经在您启动该过程的主体时进行了评估。因此delay不会做任何事情,因为它当时已经计算过了。 cons-stream必须是宏。

DrRacket 不是一种语言实现。这是一个支持多种语言的 IDE。其中之一是 SICP 兼容语言。我设法在 DrRacket 中使用此代码运行您的代码而不会出错:

#!planet neil/sicp

(define ones
(cons-stream 1 ones))

(define (integers-starting-from n)
(cons-stream n
(integers-starting-from (+ n 1))))

(define integers (integers-starting-from 1))

它就像一个魅力。 DrRacket 中的默认语言, #!racket , has streams too ,但名称不同:

#!racket 

(define ones
(stream-cons 1 ones))

(define (integers-starting-from n)
(stream-cons n
(integers-starting-from (+ n 1))))

(define integers (integers-starting-from 1))

但是对于 Scheme,你应该使用 SRFI-41,你可以从 #!racket 使用它。 (使用 (require srfi/41) )和 #!r6rs (以及完成后的 R7RS-large)

(import (rnrs)
(srfi :41))

(define ones
(stream-cons 1 ones))

(define (integers-starting-from n)
(stream-cons n
(integers-starting-from (+ n 1))))

(define integers (integers-starting-from 1))

#!racket 中滚动您自己的 SICP 流和 #!r6rs您可以使用 define-syntax
(define-syntax stream-cons 
(syntax-rules ()
((_ a d) (cons a (delay d)))))

请注意,RSFI-41 和 Racket 拥有 #!racket 的流库延迟 stream-cons 中的两个值而不仅仅是这里的 SICP 版本中的尾部。

关于functional-programming - 为什么在函数定义中进行自调用是合法的,但对于值是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31896117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com