基本上我要做的是更改复数的定义,以便我可以在Scheme中表示向量。我希望能够在没有引号的情况下编写类似“i + j + k”的内容,并且不会让程序完全疯狂。我知道复数可以用“1 + 2i”之类的东西来表示,所以我希望一个简单的覆盖可以实现这一点。
我想覆盖这个复杂的?定义可能有效,但似乎没有效果。我不确定我需要影响的代码在哪里。任何帮助都会很棒。感谢。
答案 0 :(得分:2)
您是否知道Racket阅读器已经支持复杂的文字数字?
来自the Reference的示例:
1+2i
读取等于(make-complex 1 2)
1/2+3/4i
读取等于(make-complex (/ 1 2) (/ 3 4))
1.0+3.0e7i
读取等于(exact->inexact (make-complex 1 30000000))
答案 1 :(得分:2)
简而言之:你不能用“简单的覆盖”来完成你想要的东西。 数字的语法包括用于读/写复数的+,但是 读者将2 + 3i直接转换为数字而不选择任何覆盖。
如果您想在程序中使用中缀符号,则需要更换阅读器。这在Racket中是可能的,但它比简单的覆盖更复杂。
也许你可以在Racket中使用现有的库作为中缀表示法吗?
您可能想尝试一下:
https://github.com/soegaard/this-and-that/blob/master/readtable/test2.rkt
将{}中的任何内容解析为中缀表达式。
答案 2 :(得分:0)
在Scheme标准中肯定没有提供修改Scheme阅读器,因此需要您更改所选Scheme实现的'reader' - 这是一项非常重要的任务。
使用Scheme的宏和抽象工具,最好在Scheme中嵌入自己的语言。
假设您有i,j和k的坐标基础,并且您希望将向量表达为,例如,2i + 7j-k。你可以从:
开始(define (make-coord i j k) (vector i j k))
(define (coord-i b) (vector-ref b 0))
…
然后,如果你想让事情更容易表达:
(define-syntax coord
(syntax-rules ()
((coord i j k) (make-coord i j k))))
你将用作:
(define a-coord (coord 2 7 -1))
编辑:这是一个例子。我将make-coord
替换为list
:
> (define-syntax coord
(syntax-rules ()
((coord i j k) (list i j k))))
> (coord 1 1 1)
(1 1 1)
请注意,使用语法/函数而不是读者的一个优点是可以使用表达式:
> (coord (/ 124 4) 0 0)
(31 0 0)