Lisp / scheme中的符号计算,编译时还是运行时?

时间:2018-12-26 01:21:17

标签: scheme lisp racket eval symbolic-math

我正在为折纸进行符号计算,包括计算给定两点的折痕的参数方程,如下所示。我希望将其变成一个非常简单的折纸定理证明者/ CAS混合体。

; number -> number -> vertex
(struct vertex (x y))

; lambda _ -> crease
(struct crease (equation))

; λ -> vertex -> vertex -> vertex
(define (vop-symbol op v1 v2)
  (vertex `(,op ,(vertex-x v1) ,(vertex-x v2))
          `(,op ,(vertex-y v1) ,(vertex-y v2))))

; vertex -> vertex -> vertex
(define (vadd-symbol v1 v2)
  (vop-symbol + v1 v2))

; vertex -> vertex -> vertex
(define (vsub-symbol v1 v2)
  (vop-symbol - v1 v2))

; number -> vertex -> vertex
(define (vsmul-symbol s v)
  (vertex `(* ,s ,(vertex-x v)) `(* ,s ,(vertex-y v))))

; vertex -> vertex -> crease
(define (axiom1 v1 v2)
  (crease (λ (s)(vadd-symbol v1 (vsmul-symbol s (vsub-symbol v2 v1))))))

这非常简单,但缺点是在用户输入上使用具体数字而不是符号需要eval

> (define crease1 (axiom1 (vertex 0 0) (vertex 3 3)))
> (vertex-y ((crease-equation crease1) 1/2))
'(#<procedure:+> 0 (* 1/2 (#<procedure:-> 3 0)))
> (eval (vertex-y ((crease-equation crease1) 1/2)))
1 1/2

所以我的问题是,在运行时(如在SICP函数派生示例中)或编译时执行这种符号操作是否更容易/更易于维护,是更好的实践吗? 使用值得避免使用eval的宏的麻烦?还是有功能的解决方法?

谢谢!

0 个答案:

没有答案