【问题标题】:Lisp translation [closed]Lisp 翻译 [关闭]
【发布时间】:2018-08-29 13:13:24
【问题描述】:

我需要将 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)
    )
)

【问题讨论】:

  • 这个想法是:首先是运算符或函数,然后是参数。只需将它们按正确的顺序重写即可。例如:(+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b)))) => ((angle(p1,p2) + ((pi /2) - (2 * (atan (b))))(括号我没算)
  • 好的。我会去做的。谢谢你的例子!
  • @Jean-FrançoisFabre: 1+ 是一个标准的 Lisp 函数,它的参数加 1。
  • 感谢您的澄清。我的 lisp 有点生疏/仅限于 amiga 安装程序脚本 :)
  • 我投票结束这个问题,因为 StackOverflow 不是代码翻译服务。

标签: python math lisp autolisp


【解决方案1】:

中缀符号看起来类似于:

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

【讨论】:

    【解决方案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}
    

    这给出了:

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

    【讨论】:

    • 你肯定玩得很开心。 :) :)(由于某种原因,在 IE 和 Firefox 上,点太低了)
    • @WillNess 是的,这很有趣。至于点,可以很容易地替换为\cdot{} 或\times{}。
    • 我认为,您应该使用\text 排版符号名称,例如distance。否则,基本上您将 distance 排版为组合八个变量的乘积项。
    • @Kaz 我把整个东西改成了使用琐事,因为它正在成为一个全职项目;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2018-03-09
    • 2013-04-07
    • 2023-03-06
    • 1970-01-01
    • 2023-03-04
    • 2017-10-09
    相关资源
    最近更新 更多