AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77736765
Accepted
Galladite
Galladite
Asked: 2023-12-31 01:10:34 +0800 CST2023-12-31 01:10:34 +0800 CST 2023-12-31 01:10:34 +0800 CST

为什么 (nil . nil) 在 SBCL 中计算结果为 (nil) 而不是 nil?

  • 772

在 SBCL REPL 中,为什么输入的'(nil . nil)计算结果为(nil)而不仅仅是nil?

如果空列表是 cons 单元的两个“元素”所在的列表nil,为什么它们不一样?

我对此的假设是 SBCL 做出以下评估:

(car '()) => nil
(cdr '()) => nil
(car '(nil . nil)) => nil
(cdr '(nil . nil)) => nil

但是:

'() => nil
'(nil . nil) => (nil)
lisp
  • 3 3 个回答
  • 73 Views

3 个回答

  • Voted
  1. Best Answer
    Silvio Mayolo
    2023-12-31T01:20:23+08:002023-12-31T01:20:23+08:00

    car如果作为参数给出cdr则返回。让我们先了解一下这个词,看看您实际看到的值是什么。nilnilnil

    (car '()) == '()
    (cdr '()) => nil
    

    car并cdr得到一个空列表,所以我们返回nil, 或()。

    (car '(nil . nil)) => nil
    (cdr '(nil . nil)) => nil
    

    现在(nil . nil)是(() . ())。也就是说,它是一个 cons cell,其 car 和 cdr 都是nil。

    . ()当cons 单元格末尾有 a 时,我们可以通过省略尾随的 来在符号上缩短它nil。这只是符号上的方便,所以通过我们的符号(() . ())可以写成(()), 或(nil)。请注意,这不会改变该值。最明确的书写方式仍然是(() . ()),但我们也可以将其写得更短以提高可读性。

    如果一个空列表是 cons 单元的两个“元素”都为零的列表,为什么它们不一样?

    这是不正确的。空列表根本不是缺点单元格。空列表是原子nil。它是一个符号,就像'fooor'pizza或 一样'common-lisp。这只是我们选择用于此目的的一个符号。但nil没有汽车或 cdr 细胞。碰巧的是,让(car nil)和(cdr nil)benil作为算法的极端情况通常很方便,因此函数 car和cdr在 上有特殊的行为nil。但nil不是一个缺点细胞。

    > (consp nil)
    nil
    > (consp '())
    nil
    > (consp '(1 . 2))
    T
    

    根据系统类LIST,list类型可以描述为

    类型cons和null形成类型列表的详尽分区。

    因此Common Lisp 中的列表被定义为“cons 单元格或特殊值nil”。值得注意的是,nil它本身并不是一个缺点细胞。

    • 4
  2. Rainer Joswig
    2023-12-31T17:36:22+08:002023-12-31T17:36:22+08:00

    这不是 SBCL 特有的。它是在 Common Lisp 标准中定义的。

    cons 单元中的 NIL

    请注意,NIL和()是同一个对象,只是写法不同:

    CL-USER 33 > (eq 'nil '())
    T
    

    另请注意,您不评估(nil . nil),而是评估'(nil . nil)。前者不是有效的 Lisp 代码。后者是,因为它是一个语法正确的引用 s 表达式。

    (nil . nil)等于(nil),但写法不同。cons 结构是相等的。

    上面的 s 表达式是相等的:

    CL-USER 34 > (equal '(nil . nil) '(nil))
    T
    

    NIL 的 CAR 和 C****R

    当使用空列表(-> 符号/列表)调用时, Common Lisp 的所有cxxxr操作都定义为返回:NILNIL

    CL-USER 35 > (car 'nil)
    NIL
    
    CL-USER 36 > (car '())
    NIL
    
    CL-USER 37 > (caddar 'nil)
    NIL
    

    请参见访问器 CAR、CDR、CAAR、CADR、CDAR、CDDR、CAAAR、CAADR、CADAR、CADDDR、CDAAR、CDADR、CDDAR、CDDDR、CAAAAR、CAAADR、CAADAR、CAADDR、CADAAR、CADADR、CADDAR、CADDDR、CDAAAR、CDAADR、 Common Lisp 标准中的CDADAR、CDADDR、CDDAAR、CDDADR、CDDDAR、CDDDDR 。

    car x=>对象

    如果x是cons,car则返回该cons的汽车。如果x是,汽车返回。nilnil

    carCommon Lisp 和Scheme 语言之间函数的差异

    这和编程语言Scheme不同,哪里(car '())有错误。例如,参见R7RS 小型汽车。

    注意,乘坐空列表的车是错误的。

    另请注意,Scheme没有nil. 它在语言中是未定义的,因此与空列表 不同()。在Scheme 中评估空列表 ()是一个错误。

    以下Scheme表达式计算结果为错误:

    (car ())       ; evaluating the empty list is an error in Scheme
    (car '())      ; car of an empty list is an error in Scheme
    (car 'nil)     ; car of the symbol nil is an error in Scheme
    

    上述三个表达式NIL在 Common Lisp 中的计算结果为。

    • 2
  3. ignis volens
    2024-01-01T00:25:32+08:002024-01-01T00:25:32+08:00

    你在这里犯的一个严重错误是以错误的方式得到了暗示。特别是,在 Common Lisp 中,空列表的carand cdrof 返回空列表是正确的,但任何为 true 的对象都不是空列表。事实上,很明显这不可能是真的,因为空列表对象是唯一的,而(eq (cons '() '()) (cons '() '()))必须是假的。

    因此,虽然“成为空列表”意味着(在 Common Lisp 中!)采用car/cdr返回空列表,但反之则不然。

    • 1

相关问题

  • Lambda 函数与

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve