Vector 方案:将读卡器更改为接受i+;j+;k符号

Vector 方案:将读卡器更改为接受i+;j+;k符号,vector,syntax,scheme,racket,Vector,Syntax,Scheme,Racket,基本上,我想做的是改变阅读器,让它接受向量符号,比如I+j+k。这样做的目的是将看起来像向量的东西转换成字符串,同时不影响其他任何东西。例如,如果有人键入abc,它仍然会抛出一条错误消息,但如果有人键入i+j+k,它将返回“i+j+k” 这就是我到目前为止所做的: #lang racket/base (require syntax/strip-context) (provide (except-out (all-from-out racket/base)

基本上,我想做的是改变阅读器,让它接受向量符号,比如I+j+k。这样做的目的是将看起来像向量的东西转换成字符串,同时不影响其他任何东西。例如,如果有人键入abc,它仍然会抛出一条错误消息,但如果有人键入i+j+k,它将返回“i+j+k”

这就是我到目前为止所做的:

#lang racket/base 

(require syntax/strip-context)

(provide (except-out (all-from-out racket/base) 
                     #%top) 
         (rename-out (#%my-top #%top))) 

(require (for-syntax racket/base)) 

(define-syntax (#%my-top stx)
  (syntax-case stx () 
    [(_ . quat)
     #' (test (#%datum . quat))]
    [(_ . other)  
     (syntax/loc stx 
       (#%datum . other))])) 

(define (quat? testExp)
  (regexp-match-exact? #rx"([+-]?([0-9]+[i-k]?|[0-9]*[i-k])([+-]([0-9]+[i-k]?|[0-9]*[i-k]))*)" testExp))

(define (test x)
  (cond ((quat? (symbol->string x)) (symbol->string x))
        (else (strip-context x))))
这段代码用于将向量表示法转换为字符串。i+j+k成功成为“i+j+k”。但问题是它首先将所有内容转换为语法,而我无法将其恢复到原来的状态。例如,abc将变成“abc”,它不会像通常应该的那样抛出错误。我不知道该怎么解决这个问题。我原本以为我所需要的只是对最后一行的else语句做一个简单的修改,但我无法让任何东西起作用。我开始觉得我需要尝试一种全新的方法。任何帮助都将不胜感激

另外,应该注意的是,您必须在一个名为mine parse.rkt的文件中包含此代码,并在一个只有

#lang racket

(require "parse.rkt")

基于你之前的问题和这一个,我觉得你真的在与一个问题作斗争。如果你能谈论你想要的最终结果是什么,而不是试图蒙混过关地完成那些你“认为”你应该采取的步骤,但这些步骤只会让你分心。也就是说,你的整个项目是关于什么的,你的新读者将解决该项目的哪些方面?(不要说“这样我就可以解析I+j+k”;这不是(或者更确切地说,最好不要是)你整个项目的目的!)你可能想读这篇文章:。(当然,这只是我搜索“scheme quaternion”时的热门搜索;你也可以在其他搜索中找到乐趣。)