zoukankan      html  css  js  c++  java
  • 如何暂时修改内置函数

    在Mathematica里,内置函数一般拥有属性Protected,这意味着你不能随便内置函数的定义进行修改。当然,对于绝大部分函数(除去那些有Locked属性的)都可以Unprotect了之。但是这样做是极为危险的,有时你都忘记了自己对内置函数做了哪些修改,虽然这些修改在重启Kernel之后都会恢复,但还是不建议这样做。

    今天介绍一种暂时修改内置函数的方法,这个方法用到了没有文档的内部函数,Internal`InheritedBlock。此函数的用法和Block类似,它能将内置函数复制一份并进行任意的修改且不影响源函数。

    举个例子来介绍其使用方法。假如我们希望编写一个函数WithOrderedPlus[expr],在这个函数里运行的expr里的Plus函数将不会带有Orderless属性。我们实现的方法如下:

    SetAttributes[WithOrderedPlus, HoldFirst];
    WithOrderedPlus[expr___] := Internal`InheritedBlock[
    {Plus}, ClearAttributes[Plus, Orderless]; expr];
    

    代码开始时设置HoldFirst属性是为了防止表达式在进入Block之前就被计算。现在来试试效果:

    In[1]:= WithOrderedPlus[List @@ (b + a + c)]
    Out[1]= {b, a, c}
    

    如果在WithOrderedPlus外面计算的话,Orderless属性又回来了:

    In[2]:= List@@{b, a, c}
    Out[2]= {a, b, c}
    

    参考资料:What is in your Mathematica tool bag?

  • 相关阅读:
    Vue $nextTick的一个使用场景
    Vue 使用v-for对Object进行遍历
    JavaScript 回调函数的简单示例
    VSCode 自定义Vue snippets, 快速生成Vue模板
    git将一个分支完全覆盖另外一个分支如:dev分支代码完全覆盖某一个开发分支
    解决bootstrap时间输入框总被浏览器记住的记录遮挡住的问题
    Fiddler 屏蔽JS、抓WebSocket协议、查看接口响应时间、模拟并发请求
    细说MySQL的时间戳(Timestamp)类型
    网站建设之域名注册和域名备案
    日常项目测试用例检查点(来自一线测试人员的吐血总结)
  • 原文地址:https://www.cnblogs.com/mymma/p/3084350.html
Copyright © 2011-2022 走看看