Racket中括号与方括号是否存在语法差异?使用括号遇语法错误
Racket中圆括号与方括号的语法真相
先给结论:Racket里的圆括号()和方括号[]在语法上完全等价,二者只是风格差异,没有功能区别。你遇到的错误根本不是括号类型导致的,而是原始代码里的两个低级错误——括号不匹配,以及eq?参数传错了。
先看你写的错误代码:
#lang racket (define rember (lambda (a lat) (cond ((null? lat) (quote ())) ((eq? a (car lat) (cdr lat)) (else (cons (car lat) (rember a (cdr lat))))))))
这里有两个致命问题:
eq?是用来比较两个值相等的函数,你却传了三个参数(a、(car lat)、(cdr lat)),这本身就不符合函数的参数要求;- 第二个
cond分支的圆括号根本没闭合:((eq? ...)这个左括号一直没配对的右括号,导致后面的(else ...)被当成了这个分支内部的代码,Racket自然会把else当成普通表达式报错。
再看你修正后的代码,不仅把括号换成了方括号,还悄悄修正了两个错误:
- 把
eq?的参数改成了正确的两个:(eq? a (car lat)); - 每个
cond分支的方括号都正确闭合,else成为了独立的第三个分支。
其实你把修正后的代码换回圆括号,照样能正常运行:
#lang racket (define rember (lambda (a lat) (cond ((null? lat) (quote ())) ((eq? a (car lat)) (cdr lat)) ((else (cons (car lat) (rember a (cdr lat))))))))
之所以方括号看起来“解决”了问题,只是因为方括号的视觉区分度更高,能帮你更容易发现分支的结构问题,避免括号嵌套混乱而已。Racket官方推荐用方括号来写cond、case这类多分支结构的子句,纯粹是为了代码可读性,和语法功能无关。
内容的提问来源于stack exchange,提问作者iluvfugu
相关产品推荐
相关产品推荐

