相当于Haskell中的python eval

Pra*_*are 9 python haskell eval metaprogramming

python中有一个函数,eval它接受字符串输入并对其进行求值.

>>> x = 1
>>> print eval('x+1')
2
>>> print eval('12 + 32')
44
>>>  
Run Code Online (Sandbox Code Playgroud)

什么是Haskell相当于eval函数?

Mtn*_*ark 25

确实,在Haskell中,如在Java或C++或类似语言中,您可以调用编译器,然后动态加载代码并执行它.然而,这通常是沉重的重量,几乎从来没有人们使用eval()其他语言.

人们倾向于使用eval()某种语言,因为考虑到语言的设施,对于某些类型的问题,从类似于语言本身的程序输入构造字符串更容易,而不是直接解析和评估输入.

例如,如果你想允许用户不仅输入输入字段中的数字,而且输入简单的算术表达式,在Perl或Python中调用eval()输入要比为表达式语言编写解析器要容易得多想要允许.不幸的是,这种方法几乎总是导致整体用户体验不佳(编译器错误消息不适用于非程序员)并打开安全漏洞.在不使用的情况下解决这些问题eval()通常涉及相当多的代码.

在Haskell中,由于像Parsec这样的东西,实际上很容易为这些类型的输入问题编写解析器和求值器,并且大大消除了对它的渴望eval.


Yac*_*oby 12

它没有内置的eval函数.然而,一些关于hackage的包可以做同样的事情.(docs).感谢@luqui也有提示.


Don*_*art 10

虽然Template Haskell允许编译时评估,但语言中没有内置'eval'.

对于运行时'eval' - 即运行时元编程 - Hackage上有许多包基本上导入GHC或GHCi,包括旧的hs-plugins包和提示包.

  • 有关如何保存元数据的信息,请参阅hs-plugins文章 - 它是通过Haskell的编译时反射功能(TH)与拼接点的Data.Dynamic动态类型机制相结合完成的.http://www.cse.unsw.edu.au/~dons/hs-plugins/反射+运行时代码生成+拼接点动力学为您提供完整的多级元编程模型. (5认同)
  • 这与Python风格的eval没有任何共同之处.您将无法访问代码元数据.你所说的只是在Haskell中构建Haskell代码,它仍然是分离的.对静态编译语言进行适当评估的唯一方法(特别是如果有单独的编译)是保留所有元数据(类型,名称表等)并将编译器或解释器链接到任何二进制文件. (4认同)
  • 虽然确实有这些方法可以实现相同目的,实际上它们是更安全和更受控制的方式,@ SK-logic确实有一个有效点:Python中的eval()提供了在运行时直接编写的程序源,完全访问包含eval()*的环境,即使没有程序员打算*.在Haskell中,你必须非常清楚你想要提供运行时代码访问的内容,*这是一件好事*,但与eval()不同. (3认同)
  • 顺便说一句,请看问题中的第一个例子.你不能在Haskell中做到这一点.无法将有关本地绑定"x"的信息传递到"eval"函数中. (2认同)

SK-*_*gic 1

没有 eval 等价物,Haskell 是一种静态编译语言,与 C 或 C++ 相同,它们也没有 eval。

  • 静态*类型化*并不是运行时元编程的障碍。这只是意味着您的“eval”函数也需要进行类型检查。Haskell 插件和提示包就是这样做的。类型化运行时元编程。 (7认同)
  • 它并不总是静态编译的。看看“ghci” (2认同)