Syntax “小阴谋家”;S-表达式;谓语

Syntax “小阴谋家”;S-表达式;谓语,syntax,scheme,predicate,s-expression,the-little-schemer,Syntax,Scheme,Predicate,S Expression,The Little Schemer,小阴谋家问道。但是如何测试呢 从语法上来说,我知道如何测试其他语句,比如 Is it true that this is an S-expression? xyz 及 不完全确定如何测试这个 > (list? '(atom)) 因为它刚刚回来 > (list? '(atom turkey) or) 但无论如何,知道如何测试S表达式让我很困惑 因此,像往常一样,任何备受赞赏的照明一个“S表达式”是由原子通过几个(可能为零)cons应用程序构建的: (定义(sexp?expr)

小阴谋家问道。但是如何测试呢


从语法上来说,我知道如何测试其他语句,比如

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

不完全确定如何测试这个

> (list? '(atom))
因为它刚刚回来

> (list? '(atom turkey) or)
但无论如何,知道如何测试S表达式让我很困惑

因此,像往常一样,任何备受赞赏的照明

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

(定义(sexp?expr)
(或
;若干情况:
(原子?表达式)
或
(和(配对?expr);配对由cons构建
(sexp?(carexpr));来自“car”
(sexp?…);和一个“cdr”
))) 
这实际上是用英语写的。没有更多的话要说(在代码中,我的意思是)。除了,在定义了缺少的

or: bad syntax in: or

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

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

但在这些语言中,一切都是s表达式并不完全正确。在本例中,您有一个语法不正确的表达式,因此当它试图读入时,语言会阻塞。换句话说,它不是一个s表达式

我知道这很令人沮丧,老实说,这不是一个很好的答案,但这是计算机编程黄金法则之一的一个很好的教训:垃圾输入,垃圾输出。最重要的是,你会遇到这些类型的错误,仅仅是因为在开始编程时,如果不使用语言本身,就用各种可能的方法来测试某些东西不是S表达式,这是不可行的。

签出和其余部分。:)<代码>(列表?'(atom turkey)或)也是一个S表达式。当REPL尝试对其求值时(即当它将其视为LISP代码时),问题就出现了。:)调用
(sexp?'(list?'(atom turkey)或))
应返回
#t
or: bad syntax in: or
(define (atom? x) 
  (not (pair? x)))