【问题标题】:What is the recommended way to make & load a library?制作和加载库的推荐方法是什么?
【发布时间】:2017-02-02 12:49:43
【问题描述】:

我想创建一个小型“库”供我未来的 maxima 脚本使用,但我不太确定如何进行(我使用 wxMaxima)。 Maxima 的文档涵盖了save()load()loadFile() 函数,但没有提供示例。因此,我不确定我是否使用了正确/最佳的方式。我当前的解决方案基于 this 帖子,以 *.lisp 格式存储我的库。

举个简单的例子,假设我的库定义了cosSin(x) 函数。我打开一个新会话并将这个函数定义为

(%i0) cosSin(x) := cos(x) * sin(x);

然后我将其保存到位于 /tmp/ 目录中的 lisp 文件中。

(%i1) save("/tmp/lib.lisp");

然后我打开一个新的 maxima 实例并加载库

(%i0) loadfile("/tmp/lib.lisp");

cosSin(x) 现已定义并可调用

(%i1) cosSin(%pi/4)

(%o1) 1/2

但是,我注意到 maxima 附带的大量库是 *.mac 格式的:/usr/share/maxima/5.37.2/share/ 目录包含 428 个 *.mac 文件和 516 个 *.lisp 文件。它是更好的格式吗?我将如何生成这样的文件?

更一般地说,可以保存和加载库的不同方式有哪些?推荐的方法是什么?

【问题讨论】:

    标签: maxima


    【解决方案1】:

    通常人们将他们需要的函数放在文件名something.mac 中,然后load("something.mac"); 将函数加载到Maxima 中。

    一个文件可以包含任意数量的函数。一个文件可以加载其他文件,所以如果你有somethingA.macsomethingB.mac,那么你可以有另一个文件,只是说load("somethingA.mac"); load("somethingB.mac");

    也可以创建 Lisp 文件并加载它们,但不需要在 Lisp 中编写函数。

    除非您对编写 Lisp 函数特别感兴趣,否则我的建议是使用 Maxima 语言编写函数并将它们放在一个文件中,使用普通的文本编辑器。另外,我建议您不要使用 save 将函数作为 Lisp 代码保存到文件中;只需使用纯文本编辑器将函数作为 Maxima 代码输入文件即可。

    查看share 中的文件,了解其他人的做法。我现在正在查看share/contrib/ggf.mac,我看到它有一个很长的注释标题来描述它的目的——这样的 cmets 总是一个好主意。

    【讨论】:

    • 感谢您的回答:我能够按照您的说明创建和加载 *.mac 文件 :)。我仍然有一个问题:有没有办法将保存为 *.wxmx 的 wxMaxima 文件(在以前版本的 wxMaxima 中保存为 *.wxm)转换为 *.mac 文件?我试图简单地将文件从 lib.wxmx 重命名为 lib.mac,但没有奏效……
    • wxmx 文件实际上是一个 zip 文件,其中包含 Maxima 代码以及任何图像,可能还有其他一些东西。所以这就是为什么只是重命名它不起作用。提取 Maxima 代码的最简单方法可能是使用 wxMaxima 打开 wxmx,然后在“文件”菜单上选择“另存为 ...”,并将输出类型设置为“Maxima 批处理文件 (.mac)”。我在不使用 wxMaxima 的情况下开发了一个提取 Maxima 代码的工具,但事实证明这很费力。如果您有兴趣,可以在 Github 上找到该项目的代码,请参阅:github.com/robert-dodier/maxima-read-wxmx
    • 确实,我可以使用菜单中的“文件 > 导出”按钮按照您的说明从 wxMaxima 保存 *.mac 文件。这可能是最好的选择:谢谢!
    • @RobertDodier 可以将load 调用作为 .mac 文件的一部分吗?我正在建立一个有用的函数库,但暂时将它们保存为单独的 .mac 文件,直到我弄清楚核心库应该是什么。我曾希望在给定函数的 .mac 文件中包含所有必要/有用的 load 调用(前 2-3 行是 load 命令,然后是新函数的定义);但是,我最初的尝试似乎没有奏效。
    • @RaxAdaam 是的,.mac 文件可以反过来调用load 来加载其他文件。但是,请注意,Maxima 不够聪明,无法在获得第一个文件的相同位置查找文件。例如如果您说load("some/path/to/foo.mac"),则不会在some/path/to 中搜索foo.mac 中的任何load("bar.mac");这并不完全是一个错误,尽管它确实使它不太方便。如果你有多个文件要加载,你可以说push("some/path/to/###.mac", file_search_maxima),然后是load("foo.mac"),在那个load("bar.mac")中等等。更多信息:? file_search
    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 2013-05-08
    • 2022-12-04
    • 2010-10-19
    • 1970-01-01
    • 2015-08-19
    • 2017-02-06
    相关资源
    最近更新 更多