python + lisp hy的新手注记2 eval, HyModel and python AST

来自我在Stack Overflow上的提问,https://stackoverflow.com/questions/51675355/how-to-eval-a-cond-case-and-return-function-object

(hy作者回复真及时,但是之前在github issue里提问就被拒了 哈哈哈)

我的问题是,我需要自己组装 带有条件表达式(cond [p  e]) 。

p多变,而e基本不变。因此希望和gcc编译到中间语言RTL一样,在RTL层做点优化,部分求值。

准确的说,先把e求值求出来,我的e语句的求值结果是function object

然后在时节1装入 条件语句p

在时节2 对(cond [p  e]) 用eval求值,就直接得到 想要的函数对象了

代码大概这样

;a fn object
(setv a_fn (fn [x] (+ 1 x)))
;a mock predicator
(setv predicator True)
;inject predicator and a_fn into a (cond ..)
(setv cond_expr `(cond [(~predicator) [~a_fn]]))
;eval at another place
(eval cond_expr)

但是这样是报错的:

got TypeError: Don‘t know how to wrap <class ‘function‘>: <function test_cond_list_fn.<locals>.<lambda> at 0x000001B879FD3D08>

作者的解释说

hy的eval是 首先要编译到python的ast。(类似gcc前端语言 编译到 RTL的AST)

但“虽然可以把抽象对象放进hyExpression,但没法compile it”

一方面   Hy的compiler 只接受 HyModel  (hyExpression  HyList  HySymbol 还有基本类型HyInt HyString 等等),

另一方面:在 Python ast里,function object 没有显式的表示法, 所以就没有对应的HyModel  (同理可知,其他自定义的pyObejct也都这样了)

——但,不是完全无解。

作者的给出的解决方案是,不要eval 含有function object  的hyExpression 但可以有 函数的 定义

1 compile a function definition.

=> (setv a-fn (fn [x] (+ 1 x)))
=> (setv cond-expr `(cond [True ~a-fn]))
=> (eval cond-expr)
<function <lambda> at 0x0000020635231598>

注意第一行是普通单引号‘,不是反引号`

2 Or a function‘s symbol.

=> (defn b-fn [x] (- x 1))
=> (setv cond-expr2 `(cond [True b-fn]))
=> (eval cond-expr)
<function <lambda> at 0x0000020635208378>

Mmmm~  到了AST这个层次,还真是有点subtle 啊

我还得消化一下。。

原文地址:https://www.cnblogs.com/xuanmanstein/p/9417464.html

时间: 2024-10-07 15:39:33

python + lisp hy的新手注记2 eval, HyModel and python AST的相关文章

MXNet中LSTM例子注记

Preface 序列问题也是一个interesting的issue.找了一会LSTM的材料,发现并没有一个系统的文字,早期Sepp Hochreiter的paper和弟子Felix Gers的thesis看起来并没有那么轻松.最开始入手的是15年的一个review,当时看起来也不太顺畅,但看了前两个(一部分)再回头来看这篇的formulation部分,会清晰些. 本来打算自己写个程序理一下,发现这里有个参考,程序很短,Python写的总共没有200line,但要从里面理出结构来有些费劲.想起MX

WebGIS中自定义互联网地图局部注记的一种方案

1.    前言 实际项目中我们经常会遇到这样一种场景:地图底图可能是互联网地图(百度.高德.天地图)等等,同时我们自己又有某个区域单独的一套POI数据,我们需要将互联网地图中这个区域的原有POI数据进行遮罩然后只显示我们自己的POI数据. 针对这样的需求,我们首先想到的是能否我们只使用不包含注记的底图瓦片,然后再叠加上我们的POI数据.事实上,实际需求中还需要考虑一点,我们只有部分区域的POI数据,却没有其他区域的POI数据. 所以这个需求真正的核心是:除这个不规则多边形的指定区域外,地图均是

AE指定字段转成注记

转自原文 ae指定字段转成注记 ArcMap中有一个功能是Label Features,就是可以将图层内指定字段值显示以Label形式显示在主窗口上,在Label Features后,用右键点击图层,发现可以出现一个原来灰色的功能名,ConvertLabelsToAnnotation.这个功能在AE中提供,可是自己找不到设定字段值的位置,无可奈何,只有另辟蹊径. 就是先创建一个注记层,然后按照图层里指定字段的值来生成注记.就是一个一个Feature点转换.可能会比AE提供的接口效率低,没有办法,

C++的const关键词的一些注记

在c++中,const关键词出现在很多地方,有诸多的用途,也有很多的限制. 这里简单的列举一下const声明和定义的注意事项:(const对象定义时必须初始化,下面的例子只是说明一下const位置的含义) const出现在声明或者定义变量的类型的前面的时候,const修饰的是变量本身 如:const char *value; //指针a指向const char类型,是指指针所指的变量不能改变,而指针本身的值可以改变 其它情况的const修饰其左边的符号: char *const value;//

X3DOM 1.6.1 发布注记

X3DOM 1.6.1 主要包含了一些新的功能特性.bug修复,是1.6的维护性更新版本. 特性 ClipPlane 支持 实例 here 及文档 here TwoSidedMaterial 支持 实例 here 及文档 here SphereSensor 支持 文档 here 问题修复与改进增强 改进了GeoOrigin 的支持 TURNTABLE导航模式支持多点触摸 修复从Appearance移除的Shader特性 带雾(fog)应用移动到正确的位置 修复 ElevationGrid set

ArcEngine标注和注记

转自原文 ArcEngine标注和注记 标注和注记是ArcEngine中提供的两种使用文字信息标注地图要素的方式.其中标注是作为图层的属性存在的,可以动态创建,注记作为地理要素被存储.需要注意的是Shp文件不支持注记.  绘制标注的方式有两种.让我们先看第一种: 1.使用TextElment绘制标注. 这种方法的原理就是把属性表中的某个属性创建TextElment对象,然后使用IGraphicsContainer 的AddElement方法添加标注.实例代码: //使用TextElment绘制标

创建线注记LineElement

1.根据2点创建一条线 /// <summary> /// 创建线 /// </summary> /// <param name="pnt1">The PNT1.</param> /// <param name="pnt2">The PNT2.</param> public static void CreateLine( IPoint pnt1, IPoint pnt2) { IPolyline

创建文本注记TextElement

1.创建一个字体 /// <summary> /// 字体设置 /// </summary> /// <param name="size">The size.</param> /// <param name="fontname">The fontname.</param> /// <returns> /// IFontDisp /// </returns> public 

创建注记图层要素

创建完文本注记TextElement后,可以选择以屏幕注记的形式加到屏幕上,也可以通过下面的方式转为注记图层要素: IFeatureClass annocls = 获取注记图层 IDataset pDataset = annocls as IDataset; ITransactions pTransactions = pDataset.Workspace as ITransactions; pTransactions.StartTransaction(); IFDOGraphicsLayerFa