代码之家  ›  专栏  ›  技术社区  ›  hawkeye

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

  •  13
  • hawkeye  · 技术社区  · 14 年前

    CommonLisp和EmacsLisp具有原子类型谓词。Scheme和Clojure没有。 http://hyperpolyglot.wikidot.com/lisp

    7 回复  |  直到 14 年前
        1
  •  14
  •   mikera    13 年前

    在Clojure中,atom谓词并不重要,因为Clojure强调各种其他类型的(不可变的) data structures 而不是专注于单元格/列表。

    另外,“atom”这个名字用于完全不同的东西——它是Clojure的核心并发机制之一 to manage shared, synchronous, independent state .

        2
  •  13
  •   Stuart Sierra    14 年前

    Clojure拥有 coll? (collection?) atom?

        3
  •  7
  •   Óscar López    12 年前

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

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

    注意到 null 并不像其他答案所说的那样,被认为是原子。在提到的书中 原子? 大量使用,特别是在编写处理列表列表的过程时。

        4
  •  6
  •   leppie    14 年前

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

    • 这是无用的
    • 如果你需要的话,写起来很容易

    这几乎遵循了Scheme的极简主义方法。

        5
  •  2
  •   Vijay Mathew Chor-ming Lung    14 年前

    pair 是一个 atom . 因为Scheme已经定义了谓词 pair? atom? 不需要谓词,因为定义它非常简单:

    (define (atom? s)
        (not (pair? s)))
    
        6
  •  1
  •   Rainer Joswig mmmmmm    14 年前

    这是一个微不足道的函数:

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

        7
  •  0
  •   Alfgaar    7 年前

    原子可以是符号、字符、数字或null。

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

    conditional expression . 例如,如果您认为字符串是一个原子,那么添加(string?a) ,:-)。由于没有对atom的定义,因此可以按自己的方式定义它。毕竟,Scheme不知道原子是什么。

    在Lisp中 nil null 一个原子。 也是一个简化的列表 nil = (nil . nil) 2 = 2/1 ,2是整数,2/1是有理数,通过对有理数的简化,二者相等;有人说整数2也是有理数。但是list谓词已经在Scheme中定义了,不需要担心。

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

    , ; 但你不能问 . :-). 好吧,你可以,如果你自己做的话。不管a怎么说,Scheme都有一个通用谓词 number? integer? rational? , real? ; 尽管如此,number可以被认为是类类型(其他谓词指number的子类型),而atom则不是(至少在Scheme中是这样)。

    : :属于某类事物的类型。例子: