You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))))))))

这里有两个致命问题:

  1. eq?是用来比较两个值相等的函数,你却传了三个参数(a、(car lat)、(cdr lat)),这本身就不符合函数的参数要求;
  2. 第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:45:44