gpt4 book ai didi

wolfram-mathematica - 如何模拟 InStr[]?

转载 作者:行者123 更新时间:2023-12-04 08:10:10 29 4
gpt4 key购买 nike

我发现当使用 EnterExpressionPacket header 发送输入时,InString[]MathLink 模式下不起作用。所以我需要定义我自己的函数来返回上一个输入行。我开发的一种方法 here在某些情况下不起作用:

In[1]:= Unevaluated[2 + 2]
With[{line = $Line - 1}, HoldForm[In[line]]] /. (DownValues[In])
Out[1]= Unevaluated[2 + 2]
Out[2]= 2 + 2

这是因为 RuleDelayed 没有 HoldAllComplete 属性。添加此属性可以使此操作正常:

In[1]:= Unprotect[RuleDelayed];
SetAttributes[RuleDelayed, HoldAllComplete];
Protect[RuleDelayed];
Unevaluated[2 + 2]
With[{line = $Line - 1}, HoldForm[In[line]]] /. DownValues[In]

Out[4]= Unevaluated[2 + 2]

Out[5]= Unevaluated[2 + 2]

但是修改内置函数通常不是一个好主意。有更好的方法吗?

最佳答案

看来我的问题已经解决了。这是函数:

In[1]:=
getLastInput := Module[{num, f},
f = Function[{u, v},
{u /. {In -> num, HoldPattern -> First}, HoldForm[v]}, HoldAllComplete];
First@Cases[
Block[{RuleDelayed = f}, DownValues[In]],
{$Line - 1, x_} -> x, {1}, 1]]

In[2]:=
Unevaluated[2+2]
getLastInput

Out[2]=
Unevaluated[2+2]

Out[3]=
Unevaluated[2+2]

我刚从 Todd Gayley (Wolfram Research) 那里得到关于 InString in MathLink 模式的问题的答案:

InString is only assigned when using EnterTextPacket, not EnterExpressionPacket. There is no string form of the input when sending EnterExpressionPacket (whose content is, by definition, already an expression).

编辑:

我刚刚发现我的代码不适用于带有头 Evaluate 的输入表达式。解决方案是在我的代码中将 HoldForm 替换为 HoldComplete:

getLastInput := Module[{num, f},
f = Function[{u, v},
{u /. {In -> num, HoldPattern -> First}, HoldComplete[v]}, HoldAllComplete];
First@Cases[
Block[{RuleDelayed = f}, DownValues[In]],
{$Line - 1, x_} -> x, {1}, 1]]

这很好用。另一种方法是取消保护 HoldForm 并在其上设置属性 HoldAllComplete。我想知道为什么 HoldForm 默认没有这个属性?

编辑 2:

在主要问题的评论中,Leonid Shifrin 提出了更好的解决方案:

getLastInput := 
Block[{RuleDelayed},SetAttributes[RuleDelayed,HoldAllComplete];
With[{line=$Line-1},HoldComplete[In[line]]/.DownValues[In]]]

有关详细信息,请参阅评论。

编辑 3:通过将 HoldComplete 替换为双 HoldForm,可以使最后的代码变得更好:

getLastInput := 
Block[{RuleDelayed},SetAttributes[RuleDelayed,HoldAllComplete];
With[{line=$Line-1},HoldForm@HoldForm[In[line]]/.DownValues[In]]]

这个想法取自 Wolfram Research 的 Robby Villegas 在 1999 年开发者大会上的演讲。请参阅 "Working With Unevaluated Expressions" 中的“HoldCompleteForm:HoldComplete 的非打印变体(就像 HoldForm 是 Hold 一样)”小节笔记本贴here .

关于wolfram-mathematica - 如何模拟 InStr[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5036907/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com