Parsing 将Mathematica移植到倍频程

Parsing 将Mathematica移植到倍频程,parsing,compiler-construction,wolfram-mathematica,octave,parser-generator,Parsing,Compiler Construction,Wolfram Mathematica,Octave,Parser Generator,我必须把很多文件从Mathematica传输到Octave。 我找到了一个很好的解决方案,但我对Lisp不是很熟悉,所以我想知道是否有人有过向这个方向移植的经验。 在研究并向WolframAlpha发送电子邮件后,如果没有实际结果,我将不得不使用Lex和Yacc生成交叉编译器。这对我来说似乎有点过分 如有任何提示或指示,将不胜感激 澄清: 我从很多Mathematica文件开始,它们的功能必须移植到Octave。我只想在尽可能短的时间内实现这个目标,因为这是老板让我在假期里完成的任务。 感谢您的

我必须把很多文件从Mathematica传输到Octave。 我找到了一个很好的解决方案,但我对Lisp不是很熟悉,所以我想知道是否有人有过向这个方向移植的经验。 在研究并向WolframAlpha发送电子邮件后,如果没有实际结果,我将不得不使用Lex和Yacc生成交叉编译器。这对我来说似乎有点过分

如有任何提示或指示,将不胜感激

澄清:

我从很多Mathematica文件开始,它们的功能必须移植到Octave。我只想在尽可能短的时间内实现这个目标,因为这是老板让我在假期里完成的任务。 感谢您的帮助,我将查看FullForm并检查Mathematica文件中的不可移植内容。 如果只是有可能转换一定数量的文件,我将不得不手工完成其余的工作,这将需要一些时间。所以从一个程序到另一个程序基本上是一次性的


正如Leonid在文章中提到的,这项任务似乎有些过分,但我是一名学生研究助理,这正是我在系里必须完成的任务。

你不需要Mathematica解析器来移植。您需要用Mathematica编写移植程序,并重用Mathematica自己的解析器。这与符号CC的方向相同。如果我是你,我会构造一些Mathematica子语言(称之为
SymbolicOctave
),具有完全惰性的头部,然后编写一个名为say
ToOctaveCodeString
的函数。您可以参考
symbolicCC
的实现来了解C是如何实现的-它在Mathematica发行版中可用

第二个也是最复杂的部分,是编写一个从Mathematica代码子集到这个惰性
符号tave
表示的翻译器。这一部分非常重要,因为(大概)Mathematica语言有很多Octave语言本机不支持的特性,您必须在Octave中实现这些特性。在这里,您还需要使用某些技术来使用Mathematica生成Mathematica代码,我在中介绍了其中一种。所有这些都假设您可以访问Mathematica

说了这么多,如果有这样的选择,我会放弃一般的任务,只使用Mathematica。这项任务似乎在任何地方都是可行的,只适用于Mathematica的一个非常狭窄和特殊的子集,即使是这样,也不是微不足道的。如果有一个选项可以链接Mathematica并从倍频程使用它,而不是将所有内容都移植到倍频程,我会这样做(从技术上讲,这应该很容易做到)。如今,即使是完全Mathematica的商业许可证成本也相当低(与竞争产品相比,尤其是考虑到类似于Octave的产品),考虑到创建转换器的开发成本,这在财务上也可能是一个更好的选择。我与MATLAB和MATLAB都有合作(八度音阶的$$$版本)Mathematica非常经常,我非常有信心,不可能实现自动从Mathematica转换到其他Mathematica的解析器/porter。对于初学者来说,MATLAB/Octave不支持模式匹配、术语重写或函数编程,所有这些都是Mat中最常见和最佳的编码样式血球

例如,考虑纯函数(Mathematica)

在MATLAB/Octave中确实没有类似的函数。匿名函数非常接近,您可以将其写成(MATLAB/Octave)

然而,Mathematica将符号化地平方传递给函数的任何内容,而MATLAB只处理标量/向量/矩阵。因此,即使遇到纯函数,在不了解传递给纯函数的内容的情况下,也无法自动将其重写为匿名函数

MATLAB/Octave中缺少的另一个概念是mathematica中的惰性求值/
SetDelayed
:=

f := a #^2 &;
然后,
f
在调用
f
时使用
a
的值。但是,将其作为匿名函数写入:

g = @(x)a*x.^2;
将在定义时捕获
a
的值,形成一个闭包

如果你有一个主要以Mathematica的过程风格编写的代码库,那么从理论上讲,可能会翻译成八度音阶。然而,我很难想象一个严肃的Mathematica项目完全是以过程的方式编写的。简言之,需要一个人以每种语言的惯用方式来翻译逻辑e


最后,如果您试图将表达式从Mathematica转换为Mathematica/Octave,那么您可能需要查看该软件包。我经常使用此软件包将Mathematica中的计算表达式转换为Mathematica中的其他代码库。一个简单的示例是:

expr = Sin[x + x^3] + ArcSin[y];
ToMatlab[expr]
Out[1]= sin(x + x.^3) + asin(y)

从Mathematica为能力较差的系统生成代码的惯用方法不是使用第三方工具(应该与Mathematica core一样强大),而是使用Mathematica本身


这种类型的一些代码生成器已经开箱即用(用于C和Fortran),看看它们是如何实现的,然后将它们重新定位为Octave/Matlab。

Mathematica和Octave差异很大,我确信自动转换是不可能的。你能更详细地描述一下你需要什么吗?用C语言编写Mathematica解析器吗?表达式解析器相对容易编写,你可以使用Mathematica来转换但我认为你应该首先把你的问题弄清楚。为什么它看起来太过分了?如果文件中只包含简单的表达式,那么它应该很简单,否则它可能会有效地在八度音程中重新实现mathematica。我原则上同意,但对于那些不喜欢八度音程的人来说
g = @(x)a*x.^2;
expr = Sin[x + x^3] + ArcSin[y];
ToMatlab[expr]
Out[1]= sin(x + x.^3) + asin(y)