【问题标题】:Little Schemer "S-expression" predicateLittle Schemer “S 表达式”谓词
【发布时间】:2014-08-28 11:36:00
【问题描述】:
Is it true that this is an S-expression?
xyz

问小计划者。但是如何测试呢?


从句法上讲,我知道如何测试其他语句,例如

> (atom? 'turkey)

> (list? '(atom))

不完全确定如何测试...

> (list? '(atom turkey) or)

因为它刚刚返回...

or: bad syntax in: or

但无论如何,知道如何测试 S 表达式让我很困惑

因此,像往常一样,非常感谢任何照明

【问题讨论】:

标签: syntax scheme predicate s-expression the-little-schemer


【解决方案1】:

“S 表达式”是通过多个(可能为零)cons 应用程序由原子构建的:

(define (sexp? expr)
  (or
     ; several cases:
     (atom? expr)
     ; or
     (and (pair? expr)           ; a pair is built by a cons
          (sexp? (car expr))     ;  from a "car"
          (sexp? .........))     ;    and a "cdr"
          ))) 

这实际上是英文的。没什么好说的(我的意思是在代码中)。除外,在定义缺失后

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

我们看到(sexp? ...) 只能返回#t。这就是它的重点:在 Lisp 中,一切都是 S 表达式——要么是一个原子,要么是一对 S 表达式。

【讨论】:

    【解决方案2】:

    前面的答案是正确的——Scheme(和 Lisp)是基于 S 表达式的语言。提供的代码是一个很好的开始。

    但是 everything 在这些语言中都是 S 表达式并不完全正确。在这种情况下,你有一个语法不正确的表达式,所以当它试图读入它时,语言会窒息。换句话说,它不是一个 S 表达式。

    我知道这很令人沮丧,老实说,这并不是一个很好的答案,但这是计算机编程的黄金法则之一的一个很好的教训:垃圾进,垃圾出。脂肪是你会得到这些类型的错误仅仅是因为它是不可行的,当开始编程时,测试每一种可能的方式,如果没有使用语言本身。

    【讨论】:

    • (list? '(atom turkey) or) 也是一个 S 表达式。当 REPL 试图评估它时——即当它把它视为 LISP 代码时——问题就出现了。 :) 调用 (sexp? '(list? '(atom turkey) or)) 应该返回 #t
    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多