在 Org 中运行 Maxima 代码报错 incorrect syntax: / is not a prefix operator

我有一个小程序在 Org 里面使用 SymPy 代码块化简,出来的结果很怪,想用 Maxima 验算一下,如果正确,就用 Maxima 了。

目前配置了这些东西:

(org-babel-do-load-languages 'org-babel-load-languages '( (maxima .t) ))

(setq org-babel-maxima-command "d:/IDE/maxima5410a/bin/maxima.bat")
(add-to-list 'load-path "d:/IDE/Maxima5410a/share/maxima/5.41.0a_dirty/emacs")
(autoload 'maxima-mode "maxima" "Maxima mode" t)
(autoload 'imaxima "imaxima" "Frontend for maxima with Image support" t)
(autoload 'maxima "maxima" "Maxima interaction" t)
(autoload 'imath-mode "imath" "Imath mode for math formula input" t)
(setq imaxima-use-maxima-mode-flag t)
(add-to-list 'auto-mode-alist '("\\.ma[cx]" . maxima-mode))

但是运行这个例子 http://orgmode.org/worg/org-contrib/babel/languages/ob-doc-maxima.html 报错了:

#+name: test-maxima
#+header: :exports results
#+header: :var x=1.3121254
#+begin_src maxima 
  programmode: false;
  print(12^x);
#+end_src

#+RESULTS: test-maxima
| incorrect | syntax: | / | is | not | a | prefix | operator |
| ^         |         |   |    |     |   |        |          |

incorrect syntax: / is not a prefix operator

我的设置不对吗?有坑过的老师帮忙提点一下,搜了一天 WWW,资料好少啊。


截图:

.

检测过临时文件都是正确的。

已经确认是OB-MAXIMA.el的一个BUG。等待修复吧,没有道行,修改不来emacs-lisp代码。 https://emacs.stackexchange.com/questions/37084/how-to-run-maxima-src-code-in-emacs-org-at-windows, 有兴趣的老师,帮忙修改一下。;)

maxima 是专有软件吗?好像还是数学专业软件?如果是,那 ob-maxima 估计更少人用了。

我都是尽量用开源的代替,能用 python 尽量用 python。

Edit:是自由软件,有机会研究一下

Edit 2:楼主可以在 Linux 下面试一下,也许根本没有问题

也许相比跳船,你把“很怪”的问题解决会更有效益。你用的是 ob-ipython 还是 scimax?

如果是 scimax 的话,那部份结果处理的代码碰巧是我写的,我也许可以帮到你

CL 大法好。不過我最近開始试著用 Scheme。

common lisp?不太了解,你对 hy 有何看法?

新 Lisp 方言还是缺少积累啊。今儿写了百來行 Scheme,scsh 只是個有少數 shell 扩的 Scheme,就抓住了 unix 编程的精隨,让我感覺到了 Scheme 和 CL 在编程思想上的碰撞,一個只提供最少但是坚如磐石的工具,一個海纳百川。

看了 Hy Git Repo 的代碼,本貭上还是用的 python 的编程思想。

对比一下提供个感覺。

Hy

(defn handle-args-list [self]
    (setv protected #{}
          argslist `[])
    (for [[header section] (-> self (.tail) first lambda-list .items)]
      (if header (.append argslist header))
      (cond [(in header [None '&rest '&kwargs])
             (.update protected (-> section flatten set))
             (.extend argslist section)]
            [(in header '[&optional &kwonly])
             (for [pair section]
               (cond [(coll? pair)
                      (.add protected (first pair))
                      (.append argslist
                               `[~(first pair)
                                 ~(self.expand-symbols (second pair))])]
                     [True
                      (.add protected pair)
                      (.append argslist pair)]))]
            [(= header '&key)
             (setv &key-dict '{})
             (for [[k v] (-> section first partition)]
               (.add protected k)
               (.append &key-dict k)
               (.append &key-dict (self.expand-symbols v)))
             (.append argslist &key-dict)]))
    (, protected argslist))

Hy Repo 里摸的。用的还是命令式的 Control Flow。整個 Repo 全是 if cond for。

Scheme

(define (load-modules)
  (letrec ((loop (lambda (mod lv)
                  (if (null? mod)
                      (if (success lv)
                          (print 'info "No modules loaded.")
                          (begin
                            (print 'info
                                   (format #f
                                           "Total `~A' modules loaded."
                                           lv)))
                          (load-modules
                           (cdr mod)
                           (+ lv
                              (if
                               (success
                                (run* `(modprobe ,(car mod))))
                               (begin
                                 (print
                                  'info
                                  (format #f
                                          "Module `~A' loaded."
                                          (car mod)))
                                 1)
                               (begin
                                 (print
                                  'fail
                                  (format #f
                                          "Module `~A' failed to load."
                                          (car mod)))
                                 0)))))))))
    (print 'info "Loading modules...")
    (loop modules)))

这就是 Scheme 函式+rec 的毒。

看這鬼畜缩进就知是我写的。:joy:

1 个赞

1.maxima是数学里面的开源祖宗。

2.关于EMACS我现在自己调教了下,基本PYTHON ,maxima,perl 都能在ORG里面运行,满足要求了,就没有使用SCIMax,但还保留在电脑里,有时候测试用,一般都使用自己的弄的大杂烩。比较轻量一点。然后试用了下spacemacs,被吓回来了。

3.关于我那个代数计算,估计结果是对的。maxima能算,就没有去long sympy了。

18,19 ,20一切顺利,应该基本相等才对。现在手工验算了。18=20,19等不等,要化简。有了计算机基本没有心情人肉计算了。特别是现在org嵌入代码顺风顺水。

https://emacs.stackexchange.com/questions/37084/how-to-run-maxima-src-code-in-emacs-org-at-windows 然后这个东西,其实是OB-MAXIMA.EL的问题。@ET2010,你应该能搞的。正好给你一个课题。问题里面其实很清楚了。就是几个字串处理。windows 不认,没有返回MAXIMA的结果。按我的测试结果修改应该就能运行了,小虫。我学了下LISP调试,搞了大半天,又被吓回来了。后来直接在MAXIMA环境里计算的,没有在ORG里面使用计算。

这个不是CLISP,是MAXIMA使用CLISP 返回的。这个的BUG,在OB-MAXIMA.EL第76行。要修改的是。emacs-lisp文件。

刚好也在学Racket。。

像我老板说的话 :joy:

Sorry,我不用 windows 下的 emacs, 没法帮你测试了

开玩笑的啦。:)不好意思啊。 生命不息,折腾不止。要是那天没有折腾的了,看如何办。

我其实是想问问用 hy 有什么好处的,因为一直对它有点心痒(信仰?)

希望你能给我泼点冷水

没关系,我知道你是开玩笑,不过看出来你应该也是搞学术的

不懂 Maxima,但我试了下你提到的例子,结果正确,也没遇到问题。


一些版本信息:

(shell-command-to-string "maxima --version")
     => "Maxima 5.41.0
"

(org-version nil t)
     => "Org mode version 9.1.3 (release_9.1.3-167-gd788d1 @ /Users/xcy/src/org-mode/lisp/)"

(emacs-version)
     => "GNU Emacs 27.0.50 (build 6, x86_64-apple-darwin17.2.0, NS appkit-1561.10 Version 10.13.1 (Build 17B48))
 of 2017-11-17"

emacs 27 ?

我 26 还没用上呢 :joy:

楼主的问题应该就是 Windows 引起的,我虽然没有测试,但是感觉 linux 下应该也没有问题。

那应该是windows独有的问题了。一会路径斜杠。一会这样那样问题。啥时候天下才能一统啊。我到是宁愿LINUX,但是N多世俗的工具又在WINDOWS 里面。等天下统一吧。

其实你可以像我这样两个都用的,windows 下面开一个 linux 虚拟机就行了,配置好共享文件夹就可以让效率最大化。论坛里不少人都这么用的。

目前真是这样搞的。感觉EMACS在虚拟机里比WINDOWS 还快。两边都装全家桶很烦,看来的试着完全迁移到LINUX了。

Hy 吧,其實和 Python 无啥大区別,可以做己会 Lisp 或 Python 中一者時学另一者的过渡。 隨手学了也可以,对你來說学习成本应該不高。

1 个赞

又有新语言出来了?啥特点啊。是不是神器啊。