gpt4 book ai didi

wolfram-mathematica - 阅读已定义函数的代码(尤其是从 System` 上下文中)的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:43:01 27 4
gpt4 key购买 nike

偶尔我们想看看 System`定义函数(当它们用 Mathematica 编写时)。这个问题是关于做到这一点的最佳方法。

要记住的几点:

  • 当然ReadProtected需要先删除。
  • 内置插件通常需要至少使用一次才能加载到内核中。当它们具有扩展功能(例如通过选项)时,一个简单的调用通常就足够了吗?
  • Information ( ?? ) 以难以阅读的格式给出定义(没有缩进,并且所有私有(private)上下文名称都在前面)。摆脱上下文名称并获得格式化代码的最佳方法是什么?

    摆脱某些上下文的一个想法是Block[{$ContextPath = Append[$ContextPath, "SomeContext`Private`"], Information[symbol]] .代码可以使用 Workbench 自动格式化。一些问题仍然存在,例如Information不引用字符串,防止代码被复制到工作台中。

  • 一般来说,我感兴趣的是人们如何做到这一点,他们使用什么方法使内置代码尽可能易于阅读。

    用例:比如最近挖了 RunThrough的代码当我发现它根本无法在 Windows XP 上运行时(事实证明,当临时文件的路径包含空格时,它无法引用临时文件的名称)。

    更新: It appears曾经有一个功能可以打印没有附加上下文的定义, Developer`ContextFreeForm ,但在较新的版本中不再起作用。

    最佳答案

    关于 pretty-print :以下是基于@Mr.Wizard 的答案的非常示意性的代码,以表明一些简单的规则可以大大提高代码的可读性:

    Internal`InheritedBlock[{RunThrough},
    Unprotect[RunThrough];
    ClearAttributes[RunThrough, ReadProtected];
    Block[{$ContextPath = Append[$ContextPath, "System`Dump`"]},
    With[{boxes = ToBoxes@ DownValues[RunThrough]},
    CellPrint[Cell[BoxData[#], "Input"]] &[
    boxes /.
    f_[left___, "\[RuleDelayed]", right___] :>
    f[left, "\[RuleDelayed]", "\n", right] //.
    {
    RowBox[{left___, ";", next : Except["\n"], right___}] :>
    RowBox[{left, ";", "\n", "\t", next, right}],
    RowBox[{sc : ("Block" | "Module" | "With"), "[",
    RowBox[{vars_, ",", body_}], "]"}] :>
    RowBox[{sc, "[", RowBox[{vars, ",", "\n\t", body}], "]"}]
    }]]]]

    这肯定不是一个通用的解决方案(特别是在没有许多单独语句的深度嵌套的函数代码上它不会很好地工作),但我相信它可以被改进和推广,而不需要太多麻烦来涵盖许多感兴趣的案例。

    关于wolfram-mathematica - 阅读已定义函数的代码(尤其是从 System` 上下文中)的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8607813/

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