(define (prime max)
(let ((a 2)))
(if not(= modulo max 2) 0)
((+ a 1)
prime(max))
)
它告诉我形式(let((a 2)))不好,但是据我所知,语法和代码是正确的
答案 0 :(得分:2)
不,这是不对的。 let
格式具有以下语法:(let binds body)
您的绑定是((a 2))
。你的身体在哪您将其放在let
表单之外。这就带来了两个问题:let
的格式错误,仅包含一个参数而不是两个参数,并且a
在其出现的位置未声明。(不涉及代码的逻辑,这也是不正确的) ,假设您正在尝试使用素数测试功能。)
答案 1 :(得分:0)
let
的格式是
(let ((<var1> <value1>)
(<var2> <value2>)
...
(<varN> <valueN>))
<expr1>
<expr2>
...
<exprN>)
调用函数的一般形式是
(<function> <arg1> <arg2> ... <argN>)
因此您的not
呼叫是错误的,应为(not ...)
,而对prime
的呼叫应采用(prime max)
的形式。
您正确地获得了加号“ {operator” (+ a 1)
,但是Lisp方言与其他语言之间的一大区别确实是您没有特殊的运算符,只是函数。 (+ a 1)
就像(add a 1)
一样:您只是在调用一个名为+
的函数;没有特殊的一元前缀/后缀大小写或优先级和关联性规则...只是函数:not
是一个函数+
是一个函数。
Lisp的“语法”一开始可能让人觉得很奇怪(如果并且因为您之前已经接触过其他编程语言),但是问题不会持续很长时间,并且所有的括号都消失了,您开始“参见“代码的简单树形结构。
在其他语法复杂性方面,例如C ++是如此复杂,以至于即使是专业的程序员和编译器作者也可以就如何解释以及给定语法结构的语义含义进行长时间辩论。没开玩笑的是,C ++规则的作用要小得多:“如果语法是模棱两可的,并且既可以视为声明也可以视为表达式,那么它就是声明”(https://en.wikipedia.org/wiki/Most_vexing_parse)。走吧。