热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将方法内容检索为"Expr"

如何解决《将方法内容检索为"Expr"》经验,为你挑选了1个好方法。

我有一个f定义如下的函数.

f(x, y) = 3x^2 + x*y - 2y + 1

如何检索quote此方法的以下块,其中包括函数内容?

quote  # REPL[0], line 2:
    ((3 * x ^ 2 + x * y) - 2y) + 1
end

Matt B... 5

正如大家在评论中提到的那样,深入研究这样的方法领域并不是一个稳定的或官方支持的API.此外,你的简单例子是欺骗.通常,这不代表您为该方法编写的原始代码.它是一个简化的中间AST表示,具有单指派变量和极大简化的控制流程.通常,它返回的AST不是有效的顶级Julia代码.事实恰恰相反,对于你的简单例子,它就是这样.

也就是说,有一种记录的方法可以做到这一点.您可以使用code_lowered()访问此中间表示而无需挖掘未记录的字段.这将适用于Julia版本,但我认为尚未对中间表示的稳定性进行官方保证.这是一个稍微复杂的例子:

julia> f(X) = for elt in X; println(elt); end
f (generic function with 1 method)

julia> code_lowered(f)[1]
LambdaInfo template for f(X) at REPL[17]:1
:(begin
        nothing
        SSAValue(0) = X
        #temp# = (Base.start)(SSAValue(0))
        4:
        unless !((Base.done)(SSAValue(0),#temp#)) goto 13
        SSAValue(1) = (Base.next)(SSAValue(0),#temp#)
        elt = (Core.getfield)(SSAValue(1),1)
        #temp# = (Core.getfield)(SSAValue(1),2) # line 1:
        (Main.println)(elt)
        11:
        goto 4
        13:
        return
    end)

julia> code_lowered(f)[1] == methods(f).ms[1].lambda_template
true

如果您确实希望完全按照编写的方式查看代码,最好的方法是使用嵌入的文件和行信息并参考原始源.请注意,这正是Gallium.jl(Julia的调试器)在逐步执行函数时查找源的方式.它没有文档,但您甚至可以访问交互式定义的函数的REPL历史记录.了解Gallium如何通过这里完成它.



1> Matt B...:

正如大家在评论中提到的那样,深入研究这样的方法领域并不是一个稳定的或官方支持的API.此外,你的简单例子是欺骗.通常,这不代表您为该方法编写的原始代码.它是一个简化的中间AST表示,具有单指派变量和极大简化的控制流程.通常,它返回的AST不是有效的顶级Julia代码.事实恰恰相反,对于你的简单例子,它就是这样.

也就是说,有一种记录的方法可以做到这一点.您可以使用code_lowered()访问此中间表示而无需挖掘未记录的字段.这将适用于Julia版本,但我认为尚未对中间表示的稳定性进行官方保证.这是一个稍微复杂的例子:

julia> f(X) = for elt in X; println(elt); end
f (generic function with 1 method)

julia> code_lowered(f)[1]
LambdaInfo template for f(X) at REPL[17]:1
:(begin
        nothing
        SSAValue(0) = X
        #temp# = (Base.start)(SSAValue(0))
        4:
        unless !((Base.done)(SSAValue(0),#temp#)) goto 13
        SSAValue(1) = (Base.next)(SSAValue(0),#temp#)
        elt = (Core.getfield)(SSAValue(1),1)
        #temp# = (Core.getfield)(SSAValue(1),2) # line 1:
        (Main.println)(elt)
        11:
        goto 4
        13:
        return
    end)

julia> code_lowered(f)[1] == methods(f).ms[1].lambda_template
true

如果您确实希望完全按照编写的方式查看代码,最好的方法是使用嵌入的文件和行信息并参考原始源.请注意,这正是Gallium.jl(Julia的调试器)在逐步执行函数时查找源的方式.它没有文档,但您甚至可以访问交互式定义的函数的REPL历史记录.了解Gallium如何通过这里完成它.


推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
author-avatar
余挺空荡荡_833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有