0
Is it true that this is an S-expression?
xyz

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


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

> (atom? 'turkey)

> (list? '(atom))

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

> (list? '(atom turkey) or)

因为它刚刚返回......

or: bad syntax in: or

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

所以,像往常一样,任何照明都非常感谢

4

2 回答 2

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 表达式。

于 2014-07-08T18:45:10.390 回答
0

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

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

我知道这很令人沮丧,老实说,这并不是一个很好的答案,但这是计算机编程的黄金法则之一的一个很好的教训:垃圾进,垃圾出。胖子是你会得到这些类型的错误仅仅是因为在开始编程时,在不使用语言本身的情况下测试某事物不是S 表达式的所有可能方式是不可行的。

于 2014-07-11T22:43:05.700 回答