- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我之前有asked如何制作allTrue[{x,list},test]
函数,该函数可保护占位符x
免受当前上下文中的求值,就像Table[expr,{x,...}]
保护x
一样
我最终使用的配方间歇性地失败了,我发现问题归结于将列表自动转换为PackedArrays。这是一个失败的例子
SetAttributes[allTrue, HoldAll];
allTrue[{var_, lis_}, expr_] :=
LengthWhile[lis,
TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]] &] ==
Length[lis];
allTrue[{y, Developer`ToPackedArray[{1, 1, 1}]}, y > 0]
allTrue[{x,{1,2,3}},x>0]
自动转换为
True
,我都希望
{1,2,3}
返回
PackedArray
,实现它的更好方法是什么?
最佳答案
这是我已经使用了一段时间的版本(最初将其写成我的书的第二版,但最终使用了很多)。如果参数表示一些未评估的代码,则如果我们希望将代表一个特定子句的单个代码以未评估的形式传递给它,则测试函数必须具有HoldAll
或HoldFirst
属性。
ClearAll[fastOr];
Attributes[fastOr] = {HoldRest};
fastOr[test_, {args___}] := fastOr[test, args];
fastOr[test_, args___] :=
TrueQ[Scan[
Function[arg, If[test[arg], Return[True]], HoldAll],
Hold[args]]];
HoldRest
属性,因为我们希望将参数保留为未评估的形式。我们还需要纯函数中的
HoldAll
(或
HoldFirst
)属性,以保留未评估的每个参数,直到将其传递给
test
为止。现在是否在
test
主体中使用它之前是否对其进行评估取决于
test
的属性。举个例子:
Clear[fullSquareQ];
fullSquareQ[x_Integer] := IntegerQ[Sqrt[x]];
In[13]:= Or @@ Map[fullSquareQ, Range[50000]] // Timing
Out[13]= {0.594, True}
In[14]:= fastOr[fullSquareQ, Evaluate[Range[10000]]] // Timing
Out[14]= {0., True}
In[15]:= fastOr[# &, Print["*"]; False, Print["**"]; False,
Print["***"]; True, Print["****"]; False]
During evaluation of In[15]:= *
During evaluation of In[15]:= **
During evaluation of In[15]:= ***
Out[15]= True
fastOr
接受通用的未评估代码段作为
Or
的子句,因此,如果您不关心值的开头是否要被评估(如
Evaluate
的情况),则必须将值列表包装在
Range
中。上面的示例)。
fastOr
的保留代码的程序化构造,以显示其用法(如果需要,可以考虑使用保留表达式进行速成教程)。使用保留表达式时,以下函数非常有用:
joinHeld[a___Hold] := Hold @@ Replace[Hold[a], Hold[x___] :> Sequence[x], {1}];
In[26]:= joinHeld[Hold[Print[1]], Hold[Print[2], Print[3]], Hold[], Hold[Print[4]]]
Out[26]= Hold[Print[1], Print[2], Print[3], Print[4]]
In[27]:=
held = joinHeld @@ MapThread[Hold[Print[#]; #2] &,
{NestList[# <> "*" &, "*", 3], {False, False, True, False}}]
Out[27]= Hold[Print["*"]; False, Print["**"]; False, Print["***"]; True, Print["****"]; False]
fastOr
,我们将使用另一个有用的习惯用法:在
Hold[args]
之前附加(或添加),直到获得所有函数参数,然后再使用
Apply
(请注意,通常,如果我们不希望在该部分添加/在进行评估之前,我们必须将其包装在
Unevaluated
中,因此常规用法看起来像
Append[Hold[parts___],Unevaluated[newpart]]
):
In[28]:= fastOr @@ Prepend[held, # &]
During evaluation of In[28]:= *
During evaluation of In[28]:= **
During evaluation of In[28]:= ***
Out[28]= True
fastOr
采取的方法不是很困难,但这是一种不同的实现,可以说与该特定语法的现有语言结构更紧密地对应。我建议使用
Table
和异常,因为
Table
中的迭代器接受所需的相同语法。这里是:
ClearAll[AnyTrue, AllTrue];
SetAttributes[{AnyTrue, AllTrue}, HoldAll];
Module[{exany, exall},
AnyTrue[iter : {var_Symbol, lis_List}, expr_] :=
TrueQ[Catch[Table[If[TrueQ[expr], Throw[True, exany]], iter], exany]];
AllTrue[iter : {var_Symbol, lis_List}, expr_] :=
Catch[Table[If[! TrueQ[expr], Throw[False, exall]], iter], exall] =!= False;
];
Table
完成的迭代器变量的自动动态本地化和简单性。为了安全地做到这一点,我们必须使用唯一的标签来标记一个异常,这样我们就不会错误地捕获其他异常。我发现使用Module创建持久性异常标记通常是一个非常有用的技巧。现在,举一些例子:
In[40]:= i = 1
Out[40]= 1
In[41]:= AnyTrue[{i, {1, 2, 3, 4, 5}}, i > 3]
Out[41]= True
In[42]:= AnyTrue[{i, {1, 2, 3, 4, 5}}, i > 6]
Out[42]= False
In[43]:= AllTrue[{i, {1, 2, 3, 4, 5}}, i > 3]
Out[43]= False
In[44]:= AllTrue[{i, {1, 2, 3, 4, 5}}, i < 6]
Out[44]= True
In[45]:= AllTrue[{a, {1, 3, 5}}, AnyTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]
Out[45]= True
In[46]:= AnyTrue[{a, {1, 3, 5}}, AllTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]
Out[46]= False
i
的赋值开始,以表明迭代器变量的可能全局值无关紧要-
Table
负责处理。最后,请注意(正如我在其他地方评论的那样),您对
AllTrue
和
AnyTrue
的原始签名过于严格,在某种意义上说,以下内容不起作用:
In[47]:= lst = Range[5];
AllTrue[{i, lst}, i > 3]
Out[48]= AllTrue[{i, lst}, i > 3]
lst
属性,由于
HoldAll
表示列表的事实在模式匹配时未知)。没有充分的理由保持这种行为,因此您只需删除
_List
检查:
AnyTrue[iter : {var_Symbol, lis_}, expr_]
,以及类似的
AllTrue
,将涵盖此类用例。
关于wolfram-mathematica - 非标准评估和PackedArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4911827/
我正在编写一个程序,它必须规范化音频 *.wav 文件。有一个“显示头部数据”的任务:ChunkId、ChunkSize 等等。 我想创建一个名为display_hdr 的函数(为了减少main.c
我有一个带有缩放类的 css 文件:1。 我在浏览器控制台上收到以下错误。 此页面使用非标准的“缩放”属性。相反,您可以将 calc() 或“transform”与“transform-origin:
我想模拟来自非标准密度函数的数据。我已经找到以下链接( How do I best simulate an arbitrary univariate random variate using its
使用已安装的 JDK 版本时,默认系统语言环境报告正确,但当我使用 adoptopenjdk-11 时tar.gz ,总是报告为en_US import java.util.Locale; publi
我如何强制 automake 为非标准 C++ 后缀文件生成依赖项跟踪?特别是我的意思是生成 .deps 目录文件内容。我也在使用 libtool。 谢谢 最佳答案 看看this section in
我有一个快速解决方法的问题,以享受非标准 gnu 的好处 case ranges .例如,非标准: case 1 ... 5: 可以替换为: case 1: case 2: case 3: case
我有两个“日期”字段需要加入。 第一个是格式为 yyyy-mm-dd hh:mm:ss 的普通日期时间 第二个是红头步骤子格式的 varchar(8) mmddyyyy 现在这变得很痛苦,因为没有简单
我有一个符合以下约定的 CSV val1,val2,outerStruct1{valA,valB,innerStruct2{valX, valY},valC},... 问题是当我尝试正则表达式oute
我有数据列: id name type number 1 n1 t1 num1 2 n2 t1 num2 3 n3 t1 num3 4
我正在为 Shelly 系列设备开发 openHAB2 绑定(bind)。 http接口(interface)运行良好,但无法注册获取COAP事件。 有人有使用 Californium 框架的经验吗?
我在 UILabel 上显示商标“TM”字符时遇到了一些问题。 出现问题的“TM”字符是\U0099 而不是通常的\U2122 稍微深挖一下,发现“TM”字\U0099属于极少数的汉字。 所以我猜 i
请原谅我的无知,我是 c++ 的新手。 完整错误信息: coog.cpp(74): error C3867: 'Manager::start_foo': 非标准语法;使用“&”创建指向成员的指针 我正
我有一个可以生成如下 JSON 的 API: )]}', { //JSON DATA } //JSON DATA 是有效的 JSON,但顶部的 )]}', 不是。 当我尝试通过逻辑应用获取此数
我尝试使用 Apache Ant Get task获取我们公司另一个团队生成的 WSDL 列表。他们将它们托管在 http://....com:7925/services/ 上的 weblogic 9
我在 Google App Engine 上有一个 servlet,它从页面获取文本,将其存储为实体,然后将其发送回客户端。当我存储“You're”一词时,它会像平常一样在 GAE 本地存储中显示为“
这个问题在这里已经有了答案: Is there a way to access the underlying container of STL container adaptors? (10 个答案
我在编译这段代码时遇到了问题: void MyClass::MyMethod(Type * new_ptr) { myInternalUniquePtr_->swap(std::unique_
我有两个 Eigen::VectorXd 对象,A 和 B,具有相同的维度 n。 我想创建一个新的 vector C,这样: 如果 B[i] 是 NaN,则 C[i] = A[i] 否则:C[i] =
在 C++ 中,以这种格式向日期添加一天的最简单方法是什么: “20090629-05:57:43” 可能使用 Boost 1.36 - Boost::date、Boost::posix_date 或
我正在使用 Apache HTTPComponents 4.3 的 HttpCore 库编写一个 HTTP 服务器( java )。我的服务器必须能够接收具有非标准 HTTP 方法(GET、POST、
我是一名优秀的程序员,十分优秀!