【问题标题】:Creating BlockClosures dynamically?动态创建块闭包?
【发布时间】:2013-09-03 10:16:24
【问题描述】:

我正在向 BlockClosure 添加一些柯里化的东西。

要动态完成(即,不对原始块的不同数量参数的所有情况进行硬编码),我需要动态构造 BlockClosures,以便传递不同数量的参数。

有没有办法做到这一点,即使它涉及某种动态评估/编译?

【问题讨论】:

标签: closures metaprogramming smalltalk pharo currying


【解决方案1】:

看看 Vassili Bykov 的这篇文章:

特别是据我了解,您的问题是关于不同数量的论点:

但是,由于 Smalltalk 块不支持等效的 Lisp“rest”参数,因此 curriedWithArguments: 方法必须显式枚举和处理我们实际期望在块调用中使用的所有参数。使用 CurriedBlock 会产生更好的示例。

【讨论】:

  • 看我的第二个答案。
【解决方案2】:

以下是您要查找的内容吗?在工作区尝试:

|myBlock|
myBlock := Compiler evaluate: '[ 1 + 2 ]'.

现在你已经从一个字符串编译了一个块:

myBlock class -> BlockClosure

并且可以评估它:

myBlock value -> 3

【讨论】:

  • 残酷但更接近核心 ;),谢谢。不过,有什么关于 AST 的吗?
猜你喜欢
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 2015-10-20
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多