【问题标题】:Best way to check if a list is not null?检查列表是否不为空的最佳方法?
【发布时间】:2011-09-09 10:42:57
【问题描述】:

在 Common Lisp 中,如果我想检查一个列表是否不为空,我可以简单地使用列表本身作为条件,因为所有非空列表都被认为是真的。但是,我发现在Scheme中,做同样的事情会让Scheme认为我正在尝试调用一个函数。有没有比定义另一个函数(not (null? x)) 更好的方法来检查Scheme 中的列表是否为空?

【问题讨论】:

  • “会让Scheme认为我正在尝试调用一个函数”是什么意思?
  • 如果我使用列表(作为函数参数传递)作为条件,@leppie Scheme 会抱怨。我在 Google 上查找了投诉,显然 Scheme 正在尝试使用列表中第一项的名称调用该函数,并且由于该函数不存在,Scheme 抱怨
  • 听起来你没有引用列表,@ 987654322@ vs '(1 2 3) 后者是正确的。空列表也需要引用,iow '().
  • @leppie 但是在使用函数参数时我不能引用,因为我会告诉Scheme使用符号而不是变量指向的列表
  • 对不起,我不明白你的意思,请提供一些代码示例,你所期望的,你实际得到的,错误信息以及你的 Scheme 实现也欢迎。

标签: scheme


【解决方案1】:

在Scheme中,所有不是#f 的都是真实的,所以'()if 语句中被认为是#t

因此,

(if '() "true" "false") => "true"
(not '()) => #f

使用(not (null? x)) 是检查列表是否不为空的最直接方法:它准确地描述了您想要的内容,并且在给您提供不是列表的东西的极端情况下,它会给您不同的行为:

(if (not (null? #t)) "true" "false") => "true"
(if (not #t) "true" "false") => "false"

【讨论】:

    【解决方案2】:

    如果您知道这是一个列表,则可以使用(pair? x),因为每个列表要么是一对,要么是'()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 2011-05-30
      • 2010-12-20
      • 1970-01-01
      • 2021-06-23
      • 2021-06-15
      相关资源
      最近更新 更多