mathematica 包 package 的使用

2021-11-23  本文已影响0人  Gravition

refs: tutorial/SettingUpWolframLanguagePackages

使用 Get 读取 .m 文件, 能够计算文件中的表达式, 上下文中会建立起文件中的变量.
而读取 .nb 文件, 不会建立变量, 只会建立一个笔记本的符号表达式.

环境变量和工作目录

如果遇到符号名冲突, 就使用全名调用, 或者更改 Globla` 上下文中符号的名称.

建立包

BeginPackage[]Begin[], 要配合相应的EndPackage[] and End[] 使用, 它们的效果不同:


所以 mma 中建立包的大概流程为:

BeginPackage["Package`"]    设置 Package` 为当前上下文, 并且把 System` 放进 $ContextPath
f::usage="text", ...    介绍打算要导出的对象(不包括其他对象), 函数名在这里建立后, 它的上下文会是Package`, 可以被外部使用
Begin["`Private`"]    设置当前上下文为  Package`Private`
f[args]=value, ...     给出包中定义的主要内容
End[]   恢复到之前的上下文(此处为 Package`)
EndPackage[]    结束包, 把Package`放到上下文搜索路径中

包的文件

ref: tutorial/ModularityAndTheNamingOfThings#3434

当您创建或使用 Wolfram Language 包时, 您经常希望以独立于系统的方式来引用文件.
你可以使用上下文来做到这一点.

基本的思路是: 在每个计算机系统上都约定好了规则, 如果把本地文件系统, 与 Wolfram Language 上下文 相对应.
当你使用上下文引用文件时, Wolfram Language 自动将上下文名称转换为特定计算机系统的文件路径.

<<context` 读入对应于指定上下文的文件

例如导入 Wolfram System 的标准包

<< Quaternions`

通常情况下, <<name` 寻找的次序

Wolfram Language 的设置是, <<name` 会自动尝试加载适当版本的文件.
它将首先尝试加载为您的特定计算机系统优化的 name.mx 文件.
如果没有找到, 那么它将尝试加载 name.m 文件, 它包含普通的 Wolfram Language 语法, 这种格式独立于各种计算机系统.

如果name是个目录, 那么 Wolfram Language 将尝试加载该目录下的初始化文件 init.m.
init.m 文件的目的提供一种方便的方法, 如果是package 中包含多个独立的文件
这样, 你只需给出 <<name` 命令, 然后加载init.m 来初始化整个软件包, 读取任何需要的其他文件.

初始化文件的位置

Wolfram 系统初始化文件init.m包含启动代码, 每当 Wolfram Language 内核或前端启动时都要运行.

init.m 文件的可能位置包括如下.

Wolfram 系统 BaseDirectory 的典型子目录.

通过对内核$Path变量的默认设置, 只需使用<<name`命令, 就可以从Wolfram System会话中加载附加组件.
加载 init.m 文件时, 可以再调用其他必要的文件或软件包.

通过将附加组件放在 $BaseDirectory$UserBaseDirectoryAutoload 子目录下, 你可以让 Wolfram System 在你启动内核或前端时自动加载附加组件.

自动导入 Package

其他教程已经讨论了使用 <<packageNeeds[package] 显式加载 Wolfram Language 软件包的方法.

然而, 有时你可能想设置 Wolfram Language, 以便在需要特定的包时自动加载它.
你可以使用 DeclarePackage 来给出在某个特定包中定义的 符号.
然后, 当这些符号之一被实际使用时, Wolfram Language 将自动加载定义该符号的.

DeclarePackage["context`", {"name1", "name2", ...}]
如果使用了 `name_i` 中的任意一个, 它隶属的包会被自动被载入.

当你 set up 了大量的 Wolfram 语言包时, 创建一个额外的 "名称文件" 通常是个好主意,
它包含了一连串的 DeclarePackage 命令, 指定了在使用特定名称时要加载的packages.
在一个特定的 Wolfram System 会话中, 你只需要显式加载 "名称文件".
然后, 所有其他的包将在需要的时候将会自动加载.

DeclarePackage 的工作方式是: 立即用你指定的名称创建符号, 但给这些符号都添加一个特殊属性 Stub.
每当 Wolfram Language 找到一个带有 Stub 属性的符号时, 它就会自动加载与该符号的上下文对应的package, 以试图找到该符号的定义.

搜索路径,$Path

$Path 给出了, 搜索外部文件所使用的搜索目录的默认列表.

基本例子

读取文件,Get

<<name; 读入文件, 计算其中的每个表达式, 并返回最后一个表达式.
Get[stream] ; 从 stream(流)中读取, 计算其中的每个表达式并返回最后一个表达式.
Get["file", "key"]; 读取一个用 Encode["source", "file", "key"] 编码的文件.

Details and Options

选项

Path

默认情况下, 在搜索文件时会查询 $Path上的所有目录:

Get["ExampleData/language"]
Out[1]= 22 a b + 56 c + 13 a d

强制只搜索当前目录:

Get["ExampleData/language", Path -> "."]
Out[2]= $Failed

属性和关系

上一篇下一篇

猜你喜欢

热点阅读