scheme - SICP实践3.51错误类型申请: #<syntax-transformer cons-stream>

标签 scheme sicp guile

在SICP的实践3.51中,它定义了一个过程“show”,并使用stream-map创建一个流:

(add-to-load-path ".")
(load "stream.scm")

(define (show x)
  (display-line x)
  x)

(define x0 (stream-enumerate-interval 0 3))

(display-stream x0)   ;succ, no error

(stream-map show x0)  ;all element printed, but interpreter report error at last

关于 stream.scm 中流的其他工作人员:

#!/usr/bin/guile
!#

(define (stream-null? s)
  (null? s))

(define (stream-ref s n)
  (if (= n 0)
      (stream-car s)
      (stream-ref (stream-cdr s) (- n 1))))

(define (stream-map proc s)
  (if (stream-null? s)
      the-empty-stream
      (cons-stream (proc (car s))
                   (stream-map proc (stream-cdr s)))))

(define (stream-for-each proc s)
  (if (stream-null? s)
      'done
      (begin
        (proc (stream-car s))
        (stream-for-each proc (stream-cdr s)))))

(define (display-stream s)
  (stream-for-each display-line s))

(define (display-line x)
  (display x))

(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))

(define (stream-enumerate-interval low high)
  (if (> low high)
      the-empty-stream
      (cons-stream
        low
        (stream-enumerate-interval (+ low 1) high))))

(define (stream-filter pred stream)
  (cond
    ((stream-null? stream) the-empty-stream)
    ((pred (stream-car stream))
     (cons-stream (stream-car stream)
                  (stream-filter pred (stream-cdr stream))))
    (else
      (stream-filter pred (stream-cdr stream)))))

(define-syntax cons-stream
  (syntax-rules ()
    ((_ a b) (cons a (delay b)))))

(define the-empty-stream '())

(define (stream-enumerate-interval low high)
  (if (> low high)
      the-empty-stream
      (cons-stream low
                   (stream-enumerate-interval (+ low 1) high))))

错误是这样的:

0123Backtrace:
           8 (apply-smob/1 #<catch-closure 557e16ae8c20>)
In ice-9/boot-9.scm:
    705:2  7 (call-with-prompt ("prompt") #<procedure 557e16aef6a0 …> …)
In ice-9/eval.scm:
    619:8  6 (_ #(#(#<directory (guile-user) 557e16b9e140>)))
In ice-9/boot-9.scm:
   2312:4  5 (save-module-excursion #<procedure 557e16b24330 at ice-…>)
  3822:12  4 (_)
In stream.scm:
     25:8  3 (stream-map #<procedure show (x)> (0 . #<promise (1 . …>))
     25:8  2 (stream-map #<procedure show (x)> (1 . #<promise (2 . …>))
     25:8  1 (stream-map #<procedure show (x)> (2 . #<promise (3 . …>))
In unknown file:
           0 (_ 3 ())

我不知道为什么 display-stream 成功了,但是 stream-map “show” 失败了。 代码与 SICP 中的示例相同。方案解释器是“诡计”。

有什么想法吗?谢谢

最佳答案

当我移动时错误消失了

(define-syntax cons-stream
  (syntax-rules ()
    ((_ a b) (cons a (delay b)))))

到文件的顶部。

显然,在 Guile 中,它必须在文件中的第一个使用点之上定义。

您没有看到 stream-enumerate-interval 的错误,因为它定义了 两次 - 最后一次低于的定义cons-stream.

测试于 https://ideone.com它使用“guile 2.0.13”。

关于scheme - SICP实践3.51错误类型申请: #<syntax-transformer cons-stream>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50057773/

相关文章:

function - 方案中的简单高阶函数

scheme - 给定索引列表重新排列列表

scheme - 为什么这个方案函数运行正确却产生 "illegal function"错误?

list - 在 Scheme 中交换列表中的两个元素

scheme - 方案中循环定义的问题

javascript - 我想实现一个学习 SICP 的方案解释器

scheme - 了解 MIT Scheme 中的 block 结构

function - w.r.t.的三个问题评价的环境模型

c - Guile 程序错误 "procedure->pointer": Wrong Type Argument in Position 1

ubuntu - 如何使用 shebang 表示法运行 guile Scheme 脚本?