Scheme和Clojure没有原子类型谓词 - 这是设计的吗?

问题描述 投票:13回答:7

常见的LISP和Emacs LISP具有原子类型谓词。 Scheme和Clojure没有它。 http://hyperpolyglot.wikidot.com/lisp

是否存在设计原因 - 或者它不是包含在API中的基本功能?

clojure lisp scheme elisp predicate
7个回答
14
投票

在Clojure中,原子谓词并不那么重要,因为Clojure强调各种其他类型的(不可变的)data structures而不是关注cons细胞/列表。

它也可能引起混淆。如果给出一个hashmap,一个集合或一个向量,你会如何期望这个函数的行为?还是一个代表一些复杂的可变数据结构的Java对象?

名称“atom”也用于完全不同的东西 - 它是Clojure的核心并发机制之一to manage shared, synchronous, independent state


12
投票

Clojure有coll?(集合?)函数,它是(有点)atom?的反函数。


6
投票

在实现R6RS的整个IronScheme标准库中,我从不需要这样的功能。

综上所述:

  • 这没用
  • 如果需要,写起来很容易

这几乎遵循Scheme的简约方法。


6
投票

The Little Schemer一书中,atom?的定义如下:

(define (atom? x)
  (and (not (pair? x))
       (not (null? x))))

注意到null不被视为原子,正如其他答案所暗示的那样。在上面提到的书中,atom?被大量使用,特别是在编写处理列表列表的程序时。


2
投票

在Scheme中任何不是pair的东西都是atom。由于Scheme已经定义了谓词pair?,因此不需要atom?谓词,因为定义它是如此微不足道:

(define (atom? s)
    (not (pair? s)))

1
投票

这是一个微不足道的功能:

(defun atom (x)
   (not (consp x)))

它用于列表处理,当Lisp方言使用conses来构建列表时。有些'Lisps'不是这种情况,也不是中心。


0
投票

Atom是符号,字符,数字或null。

(define (atom? a)
  (or (symbol? a)
      (char? a)
      (number? a)
      (null? a)))

我认为这些都是存在的原子,如果你发现更多添加到conditional expression。例如,如果您认为字符串是原子,请添加(字符串?a),:-)。缺少atom的定义,允许您按照自己的方式定义它。毕竟,Scheme不知道原子是什么。

在Lisp中,nil是一个原子,所以我把null变成了一个原子。 nil也是简化nil = (nil . nil)的列表,整数与简化有理数相同,2 = 2/1,2是整数,2/1是有理数,因为两者都等于理性数的简化;一个人说整数2也是一个有理数。但是列表谓词已经在Scheme中定义,没有什么可担心的。

关于这个问题。只要我担心Scheme只对类类型有谓词,atom就不是类类型,atom是包含几种类类型的抽象。也许这就是原因。但是,pair也不是类类型,但它不包含几种类类型,但有些可能会将pair视为类类型。

Atom意味着某件事不是复合的事情。不包含这样一个谓词的一个原因是当语言允许你定义原子类型时,原子的pletora可以变得越来越宽,这样的谓词就没有意义了。我不知道Scheme是否允许这样做。我只能说Scheme谓词(内置的)都是特定的。你可以问,这是一个苹果吗?这是橙色吗?但你不能问这是一种水果吗? :-)。嗯,你可以,如果你自己做的话。尽管如此,Scheme有一个通用谓词number?,数字特定谓词,integer?rational?real?;尽管如此,number可以被认为是一个类类型(其他谓词指的是数字的子类型),而atom则不是(至少在Scheme中)。

注意:类类型:属于某类事物的类型。例:

数字,整数,真实,理性,字符,程序,列表,矢量,字符串等。

© www.soinside.com 2019 - 2024. All rights reserved.