Lisp翻译

时间:2018-08-29 13:13:24

标签: python math lisp autolisp

我需要将Lisp算法转换为Python或数学方程式。有任何必要的技能吗?

;; Bulge Center  -  Lee Mac
;; p1 - start vertex
;; p2 - end vertex
;; b  - bulge
;; Returns the center of the arc described by the given bulge and vertices

(defun LM:BulgeCenter ( p1 p2 b )
    (polar p1
        (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b))))
        (/ (* (distance p1 p2) (1+ (* b b))) 4 b)
    )
)

2 个答案:

答案 0 :(得分:3)

中缀符号看起来类似于:

polar(p1,
      angle(p1,p2) + ( pi / 2 - 2 * atan(b)),
      (distance(p1,p2) * (1 + b * b)) / (4 * b)
     )

答案 1 :(得分:2)

这里有一个快速而肮脏的功能来美化它:

(ql:quickload :trivia)
(use-package :trivia)

(defun pretty (form)
  (match form
    ('pi "\\pi{}")
    ((or 'p1 'p2) (format nil
                          "~{~(~a~)_{~a}~}"
                          (coerce (string form) 'list)))
    ((type symbol) (let ((name (string-downcase (string form))))
                     (if (= (length name) 1)
                         name
                         (format nil "\\text{~a}" name))))
    ((type number) (princ-to-string form))
    ((list '1+ x) (pretty `(+ ,x 1)))
    ((list* '* args) (if (= (length (remove-duplicates args)) 1)
                         (format nil
                                 "~a^{~a}"
                                 (pretty (first args))
                                 (length args))
                         (format nil
                                 "~{~a~^\\cdot{}~}"
                                 (mapcar #'pretty args))))
    ((list '/ x) (pretty `(/ 1 ,x)))
    ((list '/ x y) (format nil
                           "\\frac{~a}{~a}"
                           (pretty x)
                           (pretty y)))
    ((list* '/ x args) (pretty `(/ ,x (* ,@args))))
    ((list* (guard op (member op '(+ -))) args)
     (with-output-to-string (out)
       (loop
         initially (princ "\\left(" out)
         for (a . b) on args
         do (princ (pretty a) out)
         while b
         do (format out " ~a " op)
         finally (princ "\\right)" out))))
    ((list* op args) (format nil
                             "~a\\left(~{~a~^, ~}\\right)"
                             (pretty op)
                             (mapcar #'pretty args)))))

在带引号的表达式上调用该表达式以获得LaTeX数学表达式。 例如,在Emacs / Slime下,以下形式后的 C-u C-x e 求值并将输出插入相同的缓冲区(您也可以使用REPL):

(progn
  (princ
        (pretty 
         '(polar p1
           (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b))))
           (/ (* (distance p1 p2) (1+ (* b b))) 4 b)
           )))
  (values))

然后您可以在最小文档中包含该字符串:

\documentclass{minimal}
\begin{document}
\[
\text{polar}\left(p_{1}, \left(\text{angle}\left(p_{1}, p_{2}\right) + \left(\frac{\pi{}}{2} - 2\cdot{}\text{atan}\left(b\right)\right)\right), \frac{\text{distance}\left(p_{1}, p_{2}\right)\cdot{}\left(b^{2} + 1\right)}{4\cdot{}b}\right)
\]
\end{document}

哪个给:

enter image description here

注意:如果您不想安装LaTeX,请使用例如http://www.codecogs.com/latex/eqneditor.phphttp://www.sciweavers.org/free-online-latex-equation-editor