在小型 Scheme 脚本中使用 Null

Null use in a small Scheme script

我只是在学习如何在 Scheme 中编写并遇到了使用 Null 的障碍。我有下面这个视频系列的脚本...

https://www.youtube.com/watch?v=Qqext1NwmqM&index=2&list=PLgyU3jNA6VjRMB-LXXR9ZWcU3-GCzJPm0

脚本...

(define (my-map fn lst)
   (if (null? lst)
    null
   (cons (fn (car lst)) (my-map fn (cdr lst)))))

这只是重新定义了Scheme中的map函数。当我传递一个函数和一个列表时,它在第三行失败为 "null: undefined. cannot reference undefined identifier"。

我只是复制了视频显示的内容,所以不确定为什么会失败。如果我为 '() 切换为 null,那行得通。有人知道为什么吗?

很可能您的 Scheme 解释器没有将 null 符号绑定到 '() 值,因为这不是语言规范所要求的。要么这样做:

(define null '())

或者等同于此,正如您已经猜到的那样:

(define (my-map fn lst)
  (if (null? lst)
      '()
      (cons (fn (car lst))
            (my-map fn (cdr lst)))))

请注意,最新的 Scheme report 指出 (null? obj) 应该 return #t

if obj is the empty list, otherwise returns #f

所以定义null'()就可以了。