Mathematica 什么时候创建新符号?

2024-03-29

再会,

我早些时候以为数学在当前符号中创建新符号$Context在转换输入字符串的阶段(即分配给InString)来输入表达式(即分配给In)。但一个简单的例子打破了这一解释:

In[1]:= ?f
During evaluation of In[1]:= Information::notfound: Symbol f not found. >>
In[2]:= Names["`*"]
Out[2]= {}
In[3]:= DownValues[In]//First
InString[1]
Names["`*"]
Out[3]= HoldPattern[In[1]]:>Information[f,LongForm->False]
Out[4]= \(? f\)
Out[5]= {}

可以看到没有任何符号f in the $ContextPath尽管它已经在定义中使用In[1].

这个例子表明,原则上是可能的数学使用不存在的符号进行定义$ContextPath而不创建它们。这可能是避免使用符号创建的方法的有趣替代方法Symbol:

In[9]:= ff := Symbol["f"]
Names["`*"]
Out[10]= {"ff"}

谁能解释一下评估过程的条件和阶段数学创建新符号?

EDIT

正如萨沙在这个问题的评论中注意到的那样,实际上我默认被欺骗了ShowStringCharacters->False默认样式表 Core.nb 中输出单元格的设置,并且错过了FullForm的输出为DownValues[In]//First。在真正的符号中f没有在定义中使用In[1]我们也可以通过使用看到InputForm:

In[1]:= ?f
DownValues[In]//First//InputForm
During evaluation of In[1]:= Information::notfound: Symbol f not found. >>
Out[2]//InputForm=
HoldPattern[In[1]] :> Information["f", LongForm -> False]

抱歉仓促发言。

所以现在的问题只是关于这个阶段数学决定创建新的Symbol我们该如何预防呢? 例如,在上面的例子中我们输入f as Symbol but 数学将其转换为String无需创建新符号。这是内置行为MakeExpression:

In[1]:= ?f
InputForm[MakeExpression[ToExpression@InString[1], StandardForm]]

During evaluation of In[1]:= Information::notfound: Symbol f not found. >>

Out[2]//InputForm=
HoldComplete[Information["f", LongForm -> False]]

也许可以定义某种类型的语法结构,在计算时间之前阻止符号创建。

关于创建新符号时的评估阶段

我们可以看到,递增$Line发生在打电话之前MakeExpression但新的Symbol创造并赋予新的价值InString and In调用后发生变量MakeExpression:

In[1]:= MakeExpression[My`boxes_,My`f_]/;!TrueQ[My`$InsideMakeExpression]:=Block[{My`$InsideMakeExpression=True},Print[$Line];Print[DownValues[InString][[All,1]]];Print[DownValues[In][[All,1]]];Print[Names["`*"]];MakeExpression[My`boxes,My`f]];
In[2]:= a
During evaluation of In[2]:= 2
During evaluation of In[2]:= {HoldPattern[InString[1]]}
During evaluation of In[2]:= {HoldPattern[In[1]]}
During evaluation of In[2]:= {}
Out[2]= a

我们可以说同样的话$PreRead https://stackoverflow.com/questions/5626387/how-to-intercept-assigning-new-value-for-the-in-variable/5626503#5626503 and $NewSymbol通话时间:

In[1]:= $NewSymbol:=Print["Names[\"`*\"]=",Names["`*"],"\nDownValues[InString]=",DownValues[InString][[All,1]],"\nDownValues[In]=",DownValues[In][[All,1]],"\nName: ",#1,"\tContext: ",#2]&
In[2]:= a
During evaluation of In[2]:= Names["`*"]={}
DownValues[InString]={HoldPattern[InString[1]]}
DownValues[In]={HoldPattern[In[1]]}
Name: a Context: Global`
Out[2]= a

$Pre执行after新分配给In被制作并且after创造一切新的Symbols 在当前$Context:

In[1]:= $Pre := (Print[Names["`*"]]; 
   Print[DownValues[In][[All, 1]]]; ##) &

In[2]:= a

During evaluation of In[2]:= {a}

During evaluation of In[2]:= {HoldPattern[In[1]],HoldPattern[In[2]]}

Out[2]= a

看起来不可能拦截为其分配新值In多变的 https://stackoverflow.com/questions/5626387/how-to-intercept-assigning-new-value-for-the-in-variable/5626503#5626503.


结论:新Symbols 是在调用后创建的$PreRead, MakeExpression and $NewSymbol但在打电话之前$Pre.


关于您在edit部分:不确定这是否是您的想法,但在前端会话中您可以使用$PreRead在解析阶段将符号保留为字符串。这是一种可能的黑客方法:

symbolQ = StringMatchQ[#, RegularExpression["[a-zA-Z$][a-zA-Z$`0-9]*"]] &;

ClearAll[keepSymbolsAsStrings];
SetAttributes[keepSymbolsAsStrings, HoldAllComplete];

$PreRead  = # //. RowBox[{"keepSymbolsAsStrings", rest___}] :>
 RowBox[{"keepSymbolsAsStrings", 
   Sequence @@ ({rest} //. x_String?symbolQ :>
       With[{context = Quiet[Context[x]]},            
        StringJoin["\"", x, "\""] /; 
         Head[context] === Context])}] &;

仅当该符号尚不存在时才会将其转换为字符串(通过检查Context[symbol_string_name])。例如

In[4]:= keepSymbolsAsStrings[a+b*Sin[c]]//FullForm

Out[4]//FullForm= keepSymbolsAsStrings[Plus["a",Times["b",Sin["c"]]]]

重要的是keepSymbolsAsStrings首先定义,以便创建该符号。这使得它可重入:

In[6]:= keepSymbolsAsStrings[a+b*Sin[c]*keepSymbolsAsStrings[d+e*Sin[f]]]//FullForm

Out[6]//FullForm= 
  keepSymbolsAsStrings[Plus["a",Times["b",Sin["c"],
  keepSymbolsAsStrings[Plus["d",Times["e",Sin["f"]]]]]]]

现在,您可以在解析代码后以您喜欢的方式处理这些符号(保留为字符串)。您还可以使用不同的symbolQ函数 - 我只是为了举例而使用一个简单的函数。

但这对包不起作用。我没有看到对包执行此操作的直接方法。一种简单的方法是动态地重新定义Needs,以与预处理阶段类似的方式在字符串级别修改源代码,并有效地调用Needs关于修改后的源。但字符串级源代码修改通常很脆弱。

HTH

Edit

上面的代码有一个缺陷,即很难区分哪些字符串是字符串,哪些是上述函数转换的符号。您可以通过更改上面的代码来修改ClearAll[keepSymbolsAsStrings] to ClearAll[keepSymbolsAsStrings, symbol] and StringJoin["\"", x, "\""] by RowBox[{"symbol", "[", StringJoin["\"", x, "\""], "]"}]跟踪结果表达式中的哪些字符串对应于转换后的符号。

Edit 2

这是修改后的代码,基于MakeExpression而不是$PreRead,正如@Alexey所建议的:

symbolQ =  StringMatchQ[#, RegularExpression["[a-zA-Z$][a-zA-Z$0-9`]*"]] &;

ClearAll[keepSymbolsAsStrings, symbol];
SetAttributes[keepSymbolsAsStrings, HoldAllComplete];

Module[{tried},
 MakeExpression[RowBox[{"keepSymbolsAsStrings", rest___}], form_] :=
  Block[{tried = True},
    MakeExpression[
       RowBox[{"keepSymbolsAsStrings", 
         Sequence @@ ({rest} //. x_String?symbolQ :>
            With[{context = Quiet[Context[x]]},            
             RowBox[{"symbol", "[", StringJoin["\"", x, "\""], "]"}] /;
             Head[context] === Context])}], form]
  ] /;!TrueQ[tried]
]

我们需要trick https://stackoverflow.com/questions/4198961/what-is-in-your-mathematica-tool-bag/5149656#5149656托德·盖利 (Todd Gayley) 打破了定义中的无限递归MakeExpression。下面再次举例:

In[7]:= keepSymbolsAsStrings[a+b*Sin[c]]//FullForm

Out[7]//FullForm= keepSymbolsAsStrings[Plus[symbol["a"],Times[symbol["b"],Sin[symbol["c"]]]]]

In[8]:= keepSymbolsAsStrings[a+b*Sin[c]*keepSymbolsAsStrings[d+e*Sin[f]]]//FullForm

Out[8]//FullForm=  keepSymbolsAsStrings[Plus[symbol["a"],Times[symbol["b"],Sin[symbol["c"]],
keepSymbolsAsStrings[Plus[symbol["d"],Times[symbol["e"],Sin[symbol["f"]]]]]]]]

这种方法更干净,因为$PreRead仍然可供最终用户使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mathematica 什么时候创建新符号? 的相关文章

  • 是什么导致了这个奇怪的 Mathematica 结果?

    我在 Mathematica 8 中遇到了一个看似错误的问题 我在网上找不到任何与之相关的内容 但我承认我不太确定要搜索什么 如果我运行这个语句 0 05 10 0 15 gt pass 1 04 10 1 14 gt pass 1 05
  • 在 Mathematica 中自动生成和

    这是我在实现的过程中遇到的一个设计问题广义分配律 https citeseerx ist psu edu viewdoc summary doi 10 1 1 125 8954 假设需要自动生成如下形式的表达式 source yarosla
  • 如何用权重标记图边

    Warning 当 Mathematica v 8 0 是最酷的孩子时 我发布了这个问题 该bug已于9 0 1版本解决 The help for EdgeLabels http reference wolfram com mathemat
  • 在 Mathematica 中使用 MySQL 数据库

    我已经看到可以使用以下命令在 Mathematica 和 MySQL 数据库之间建立连接Input Needs DatabaseLink and conn OpenSQLConnection JDBC MySQL Connector J y
  • Mathematica 协助:使用 /。将方法替换为 IF[] 条件

    首先我要声明 我是一名 Mathematica 新手 这个问题可能很容易回答 但到目前为止 我在互联网上找不到任何针对这个特定问题的帮助 在这里 我基本上总结了我需要我的代码做什么 使用时出现一些问题 将命令替换为IF条件语句 基本上 我有
  • 具有断轴和交错颜色条的直方图

    我有这些数据 a b c d e alpha 5 51 0 60 0 12 26 90 76284 53 beta 3 39 0 94 0 17 0 20 0 20 gamma 7 98 3 34 1 41 7 74 28394 93 de
  • 特征向量变换的差异:Mathematica 与 SciPy

    类似的问题之前曾在这里被问过 但似乎没有人回答我的例子 我使用 Mathematica 和 SciPy 计算矩阵 A 的特征值和特征向量 特征值一致 但特征向量则不然 1 最低 特征值 特征向量一致 2 Mathematica 和 SciP
  • 制作自定义输入表和简短输入表

    我经常希望看到数学的图形对象不在FullForm但更具可读性InputForm能够通过双击来选择代码的一部分 并轻松地将此代码复制到新的输入中Cell 但默认的InputForm不允许这样做 因为InputForm默认显示为String 不
  • 简化 Mathematica 中的正则表达式

    我最近发现克莱尼代数 http en wikipedia org wiki Kleene algebra用于操作和简化正则表达式 我想知道这是否已内置到 Mathematica 等任何计算软件程序中 如果有一个计算工具来进行大型表达式的并集
  • Mathematica 中的条件数据操作

    我正在努力准备高效数据分析的最佳工具在数学中 我有大约 300 列和 100 000 行 最好的技巧是什么 删除 提取 或简单地 考虑 数据结构的部分 用于绘制例如 我能想到的最棘手的例子之一是 给定一个数据结构 对于第 2 列中的值等于
  • 重新定义 Mathematica 中的非交换乘法

    Mathematicas NonCommutativeMultiply 不会简化诸如 a 0 0 a 0 a 1 1 a a or a a a 2 我想重新定义 去做这个 我使用 NCAlgebra 来执行此操作 但我需要 ReplaceR
  • 从稀疏定义列表中挑选无模式下值的算法

    我有以下问题 我正在开发一个随机模拟器 它随机采样系统的配置 并存储每个配置在特定时间实例被访问次数的统计数据 代码大致是这样的 f Integer Integer 0 someplace later in the code e g ind
  • Mathematica 8 中函数声明的问题

    这是一个奇怪的结果 在此示例中函数定义为 functionB 有人可以解释一下吗 我想绘制functionB x and functionB Sqrt x 它们一定是不同的 但是这段代码表明functionB x functionB Sqr
  • 将符号暴露给 $ContextPath

    有多种Internal 有用的上下文函数 例如InheritedBlock https stackoverflow com questions 4198961 what is in your mathematica tool bag 568
  • 如何捕获 TimeConstrained 产生的中断?

    数学有CheckAbort允许捕获和处理用户生成的和编程的函数Aborts 但它不允许捕获由以下函数生成的中断TimeConstrained and MemoryConstrained TimeConstrained CheckAbort
  • 在 Mathematica 中计算此递推关系的更有效方法

    Verbeia 对 Mathematica 中函数式编程风格的表现展开了一场相当有趣的讨论 在这里能找到它 在 Mathematica 中构建大型分块矩阵最有效的方法是什么 https stackoverflow com q 6867079
  • 如何让 Mathematica 内核暂停以创建外部文件

    是否可以在计算期间暂停 Mathematica 内核 这是一个例子 Module Mathematica code Calls an external program with some argument Needs to wait for
  • 解决电力塔

    a 2 Power 10 6 10 9 3 Power 4 9 7 5 TwoTower n Nest 2 1 n 最小的是什么n这样TwoTower n gt a This question http www quora com How
  • 如何在 Mathematica 中生成这样的图像

    I am thinking of process an image to generate in Mathematica given its powerful image processing capabilities Could anyo
  • Mathematica 作业中不需要的评估:为什么会发生这种情况以及如何在包加载过程中对其进行调试?

    我正在开发一个 大 包 它不再正确加载 这是在我更改一行代码后发生的 当我尝试加载包 需要 时 包开始加载 然后 setdelayed 定义之一 活跃起来 即以某种方式进行评估 被困在之前加载几行的错误捕获例程中 并且包加载中止 使用 ab

随机推荐

  • Python 服务器客户端 WinError 10057

    我正在使用 Python 3 3 制作服务器和客户端socket模块 我的服务器代码工作正常 但此客户端代码返回错误 这是代码 import socket import sys import os sock socket socket so
  • 如何覆盖 GIN 中的绑定

    我找到了 Guice 的答案重写 Guice 中的绑定 https stackoverflow com q 483087 929804但不知道如何在 GWT 中对 GIN 执行同样的操作 提前致谢 据我所知 不支持 回答您的评论 如果您运行
  • 在 json 中存储 pandas 数据帧时保持列和行顺序

    当使用 to json 将数据存储在 json 对象中并使用 read json 读回时 行和列将按字母顺序返回 有没有办法保持结果排序或在检索时重新排序 你可以使用orient split 它将索引和列信息存储在列表中 并保留顺序 In
  • 每个故事显示不同的开放图对象

    好吧 我不确定我在开放图谱中是否做错了什么 但就是这样 我的开放图谱中有 3 个故事 它们是链接到一种对象类型的三个不同操作 Make A Pledge To gt Cause Create gt Cause Log Expense For
  • 在没有 C++ 11 的情况下使用 char16_t、char32_t 等?

    我想要固定宽度类型 包括字符类型
  • 软键盘打开时调整布局

    我在某些应用程序中看到 当显示软键盘时布局会发生变化 这当然不是adjustPan因为整个布局 可能是内部布局 发生了变化 而不仅仅是当前的EditText 例如 这是在 Evernote 登录屏幕中 你能建议一下这是怎么做的吗 下面是一个
  • 如何获取 Webview iframe 链接来启动浏览器?

    我正在使用 WebView 来显示一个页面 其中 html 包含一个 iframe 其中 src xxxxx php 该 iframe 作为带有底层链接的广告图像加载 如果我单击该图像 链接 它会尝试在原始 iframe 中加载新页面 在那
  • 为什么建议将实例变量声明为私有?

    我的问题与Java有关 但它也可以应用于C 我想知道为什么每个人都建议创建实例变量private而不是制作它们受保护的 我们想一想 子类看不到私有变量 因此如果我需要访问或更改子类中超类的变量 我被迫使用一些访问器和修改器方法 例如getM
  • 将 Windows Phone 7 应用程序中的图像文件上传到 PHP

    我正在尝试从图片库 在 WP7 上 上传图片并将其保存在服务器上的文件夹中 在服务器上 我使用 PHP 通过 POST 方法接收文件 PHP 代码是
  • 在 fortran 中生成序列数组

    Fortran中是否有一个内在函数可以生成一个包含从a到b的数字序列的数组 类似于python的range gt gt gt range 1 5 1 2 3 4 gt gt gt range 6 10 6 7 8 9 不 没有 但是 您可以
  • 获取完整的正在运行的进程列表(Visual C++)

    我目前正在使用 EnumProcesses 函数来获取正在运行的进程的列表 然而 由于我的应用程序在用户空间中运行 因此它无法获取不在用户下运行的进程 包括系统进程 的句柄 是否有其他方法可以让我访问这些内容 我所需要的只是进程名称 只是为
  • Android:减少 GridView 中列之间的空间

    请参阅随附的屏幕截图 其中我试图减少 GridView 中列之间的空间 我的main xml如下
  • SQL 选择一行并存储在 SQL 变量中

    所以 我正在编写这个存储过程 但我对 SQL 真的很烂 我向你们提出的问题是 我可以选择整行并将其存储在变量中吗 我知道我可以做类似的事情 declare someInteger int select someInteger select
  • 日期时间格式和时区

    当尝试解析日期时DateTime createFromFormatPHP 将无法识别时区 Example t new DateTime echo t gt format Y m dTH i s 将输出 2012 01 24MSK16 53
  • Rails 控制台错误需要'./example_user'

    我正在使用 Railstutorialhttp ruby railstutorial org chapters rails flavored ruby sec a user class http ruby railstutorial org
  • sqlite get 字段超过 2 MB [重复]

    这个问题在这里已经有答案了 当我尝试从 SQlite 获取数据且字段大小超过 2 MB 时 它会抛出异常 Couldn t read row 0 col 0 from Cursor Window Make sure the Cursor i
  • .Net TPL:具有任务优先级的有限并发级别任务调度程序?

    我目前正在使用 LimitedConcurrencyLevelTask Scheduler 详细信息请参见此处http msdn microsoft com en us library ee789351 aspx http msdn mic
  • 当应用于基本类型时,通过引用进行 const 调用是否会提高性能?

    对于对象 尤其是字符串 按引用调用比按值调用更快 因为函数调用不需要创建原始对象的副本 使用const 还可以确保引用不被滥用 我的问题是 如果使用基本类型 如 bool int 或 double const 按引用调用是否也会更快 voi
  • 在多个环境中执行编码的 UI 测试

    现在 我的编码 UI 测试使用它们的 app config 来确定它们执行的域 该域与环境具有 1 1 关系 为了简化它 测试网 www UAT com www prod com 在 App config 中我有类似的内容
  • Mathematica 什么时候创建新符号?

    再会 我早些时候以为数学在当前符号中创建新符号 Context在转换输入字符串的阶段 即分配给InString 来输入表达式 即分配给In 但一个简单的例子打破了这一解释 In 1 f During evaluation of In 1 I