Racket能够以2 + 3i等格式读取复数 (+ 2 + 3i 4) 有效,将返回6 + 3i。我的目标是允许用户以相同的方式创建四元数,这样 (+ 1 + 2i + 3j + 4k 3 + 4i + 2j + 1k) 不会抛出任何“未定义的标识符”错误。四元数是我特别想要实现的,但这是一个更普遍的问题,即如何改变Racket阅读器解析数字的方式。 this page的1.3.3节概述了BNF中的数字语法,这就是我想要改变的内容(具体而言,是精确/不精确的复杂)。允许读者识别以这种格式编写的四元数的最佳方法是什么?
答案 0 :(得分:0)
Little Schemer和The Seductive Computer是有用的读物。我的个人意见是重载REPL。
答案 1 :(得分:0)
这个问题可能会在球拍邮件列表http://lists.racket-lang.org/users/上得到更好的答案。您可以定义自己的阅读器,但问题是现有阅读器框架的可扩展性,以及是否可以以模块化方式添加到BNF。我的猜测是你最终会复制相当多的代码,但这绝对是可能的。
答案 2 :(得分:0)
好的,已经有一段时间了,但是我有同样的问题...
我(仅部分地)仅使用语法情况解决了它,一个表示四元数的结构,正则表达式和一些运算符对语法的覆盖。
当默认阅读器找到1i+2j+3k
之类的内容时,它将作为标识符读取,您可以在扩展时通过拼接语法或使用syntax-e
和symbol->string
将其转换为符号或字符串来进行操作
要使其识别为结构,必须重写#%top
语法以扩展或调用将标识符扩展为结构语法的函数。
这是丑陋的部分,因为它需要一些繁重的语法操作并进行扩展才能正确执行,或者需要一些怪异的正则表达式才能将其错误执行但可以正常运行。尽管不推荐使用,但是一些简单的正则表达式可以满足您的需要,因为您可能需要用浮点数将四元数记为文字,这很令人怀疑,并且很可能只需要简单的正则表达式即可,例如带有方向四元数的实部0,例如1j