方案:将复数的定义更改为接受向量

时间:2014-02-19 02:23:38

标签: vector scheme racket definition overwrite

基本上我要做的是更改复数的定义,以便我可以在Scheme中表示向量。我希望能够在没有引号的情况下编写类似“i + j + k”的内容,并且不会让程序完全疯狂。我知道复数可以用“1 + 2i”之类的东西来表示,所以我希望一个简单的覆盖可以实现这一点。

我想覆盖这个复杂的?定义可能有效,但似乎没有效果。我不确定我需要影响的代码在哪里。任何帮助都会很棒。感谢。

3 个答案:

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