Scheme 如何比赛,在球拍比赛中?

Scheme 如何比赛,在球拍比赛中?,scheme,racket,Scheme,Racket,如果我有这样的东西 (定义s(hi,there)) 那我怎么才能用match写呢 喜欢 (匹配s[(,h,t)]…) 但是它不起作用,因为match需要,那么我该怎么做呢?首先注意逗号,是一个特殊的读者缩写。 (hi,there)读作(hi(unquote there))。这是 难以识别-因为默认打印机打印列表 其第一个元素是以特殊方式取消引用的 Welcome to DrRacket, version 5.3.0.14--2012-07-24(f8f24ff2/d) [3m]. Languag

如果我有这样的东西
(定义s(hi,there))
那我怎么才能用match写呢 喜欢
(匹配s[(,h,t)]…)

但是它不起作用,因为
match
需要
那么我该怎么做呢?

首先注意逗号
是一个特殊的读者缩写。
(hi,there)
读作
(hi(unquote there))
。这是 难以识别-因为默认打印机打印列表 其第一个元素是以特殊方式取消引用的

Welcome to DrRacket, version 5.3.0.14--2012-07-24(f8f24ff2/d) [3m].
Language: racket.
> (list 'hi (list 'unquote 'there))
'(hi ,there)
因此,您需要的模式是“(列表h(列表“unquote t t))”


如果要在引用的节中使用逗号作为符号,请使用反斜杠:

> (define s '(hi \, there))
> (match s [(list h c t) (symbol->string c)])
","
并对独立逗号符号使用
,|

> (match s [(list h '|,| t) (list h t)])
'(hi there)
在这两种情况下,您都应该使用空格来分隔内容,并使用列表


(define s(hi,there))
是无效的拍子。

我想您可能会对哪里需要逗号感到困惑。在Racket中,不能使用逗号分隔列表中的元素。相反,您只需使用空格。如果这是错误的,请告诉我,但我认为您正在尝试匹配一个表达式,如
(define s'(hi here))
。要做到这一点,您可以使用

(match s
  [`(,h ,t) ...])

然后,在省略号所在的区域中,变量
h
的值为
'hi
,变量
t
的值是
'there

我只想利用Racket中的
match
来解析括号内带有逗号的s表达式格式。之所以在括号内有逗号,是因为我正在解析的文件使用它来分隔很多东西,我想使用Racket match来解析文件(事实上,当我发现逗号在Racket中如此特殊时,我更感兴趣!)但感谢你们的回答)请原谅这个不请自来的评论,但在我看来,使用Racket的“匹配”来解析包含逗号的输入可能不是一个好主意;除非输入的其余部分真的非常接近racket/LISP,否则这听起来像是咬紧牙关并使用实际解析器的情况。如果我误解了您的用例,请提前道歉。@JohnClements我认为您是对的。。故事是我的主程序是用Racket编写的,我只想通过解析Racket中的文件来构建数据结构。这个文件看起来几乎像S-Exp,直到很晚,我才发现有逗号…你对源文件中可能出现的形式有什么规定吗?源文件是用某种知名语言编写的吗?@JohnClements不,没有第三方提供的文件格式规范……它们只是文本。也许我可以使用sed或awk来解析文本,或者使用任何语言来逐行解析文件,但我认为racket中的
read
可以直接读取它们,对于每个
(某物)
,我可以轻松提取一些字段,然后遇到逗号问题:)
(match s
  [`(,h ,t) ...])