将字符串分配给块并在smalltalk中执行它们

将字符串分配给块并在smalltalk中执行它们,smalltalk,visualworks,Smalltalk,Visualworks,y:=3。z:=4。 h:='[x:=y+z.]. (BlockClosure readFromString:h)值 我有这样一段代码,我试图用smalltalk语法获取一个字符串,并试图将其放入一个块中并执行它,但我得到一个错误,它说: 未处理的异常:消息未被理解#+ 当我来的时候喜欢 h:='[x:=3+4.]. (BlockClosure readFromString:h)值 它很好用。我不明白为什么会这样。我猜y没有指向任何东西,它也不理解+方法。但是为什么块不将y和z作为自由变量处理呢

y:=3。z:=4。
h:='[x:=y+z.].
(BlockClosure readFromString:h)值

我有这样一段代码,我试图用smalltalk语法获取一个字符串,并试图将其放入一个块中并执行它,但我得到一个错误,它说:
未处理的异常:消息未被理解#+

当我来的时候喜欢
h:='[x:=3+4.].
(BlockClosure readFromString:h)值


它很好用。我不明白为什么会这样。我猜y没有指向任何东西,它也不理解+方法。但是为什么块不将y和z作为自由变量处理呢?

您的问题是,在实际将字符串编译成块的上下文中,y和z是未知的。你可能会更喜欢这样的东西:

h := '[ :y :z | x := y + z]'.
(BlockClosure readFromString: h) value: 3 value: 4.
虽然我怀疑代码可能也不会工作-因为x没有在任何地方声明,所以更正确的版本应该是:

h := '[ :y :z | y + z]'.
x := (BlockClosure readFromString: h) value: 3 value: 4.

我认为没有任何真正的方法可以让块的字符串表示在解析的上下文中像真正的闭包一样工作,因为它无法访问变量,并且无法编译。

您的问题是,在实际将字符串编译成块的上下文中,y和z是未知的。你可能会更喜欢这样的东西:

h := '[ :y :z | x := y + z]'.
(BlockClosure readFromString: h) value: 3 value: 4.
虽然我怀疑代码可能也不会工作-因为x没有在任何地方声明,所以更正确的版本应该是:

h := '[ :y :z | y + z]'.
x := (BlockClosure readFromString: h) value: 3 value: 4.

我认为没有任何真正的方法可以使块的字符串表示在解析的上下文中像真正的闭包一样工作,因为它无法访问变量,并且无法编译。

如果确实需要这样做,请尝试以下操作:

   | x y z h block |
   y:=3. z:=4.
   h:= '[x:= y+z.]'.

   block := Compiler new
      evaluate: h
      in: thisContext
      allowReceiver: true
      receiver: self
      environment: self class environment
      notifying: nil
      ifFail: [self error: 'Failed to compile'].

   ^block value

然而,我建议你找到一个更好的方法来解决这个问题。在正在运行的方法的上下文中动态编译字符串非常棘手,而且可能很脆弱。

如果确实需要这样做,请尝试以下操作:

   | x y z h block |
   y:=3. z:=4.
   h:= '[x:= y+z.]'.

   block := Compiler new
      evaluate: h
      in: thisContext
      allowReceiver: true
      receiver: self
      environment: self class environment
      notifying: nil
      ifFail: [self error: 'Failed to compile'].

   ^block value

然而,我建议你找到一个更好的方法来解决这个问题。在正在运行的方法的上下文中动态编译字符串确实很棘手,而且可能很脆弱。

James Robertson最近在他的。
你可能会发现它很有用。

詹姆斯·罗伯逊最近在他的博客上发表了一篇文章。
你可能会发现它很有用。

这对我来说将是一件非常痛苦的事。但我认为你的回答有道理。非常感谢。这对我来说将是一件痛苦的事。但我认为你的回答有道理。非常感谢。