3

是否可以将块语句作为给定深度 k 的块参数传递?例如,如果 k = 1,我将 f(x) 定义为[x + 3],但如果 k=2,我想要 f(f(x)),即[[x + 3] + 3]。这是一个分配,所以我需要使用块语句。#value:似乎只取整数,是否有更通用的版本#value:

编辑:让我更清楚一点。我的函数采用从 a 到 b 的范围和深度 k。该函数将对块语句进行评估。因此,for将从 1[x + 3] method: 1 to: 3 for: 2评估[[x+3] + 3]到 3。只要 k = 1,我就可以从 1 评估到 3。我正在尝试将块语句修改[x+3][[x+3]+3],这就是我遇到麻烦的地方。我试过了

tempvariable := self "where self is the block statement [x+3]"
tempvariable := tempvariable value: self

但我得到一个 BlockClosure(Object)>>doesNotUnderstand: #adaptToNumber:andSend:错误(这就是为什么我认为它只是整数)

4

1 回答 1

4

#method:to:for:如果我正确理解了您的问题,您需要一种基于初始块创建和评估块的方法(您将其命名为)。

如在

[:x | x + 3] method: 1 to: 3 for: 1. 

变成

1 to: 3 do: [:index| [:x | x + 3] value: index].

并评估[:x | x + 3]三遍;和

[:x | x + 3] method: 1 to: 3 for: 2. 

变成

1 to: 3 do: [:index| [:y | ([:x | x + 3] value: y) + 3] value: index].

无法通过修改现有块来实现此目的。但是,我们可以尝试以另一种方式解决该问题。

让我们以不同的方式编写函数和块:

功能块                    
f(x) = x + 3 f := [:x | x + 3]。
     ↪ f(1) = 4 ↪ f 值:1 "=> 4"

f₁(x) = f(x) f1 := [:x | f值:x]。
     ↪ f₁(1) = f(1) = 4 ↪ f1 值:1 "=> 4"

f2(x) = f(f(x)) = f₁(f(x)) f2 := [:x | f1 值:(f 值:x)]。
     ↪ f₂(1) = f₁(4) = 7 ↪ f2 值:1 "=> 7"

f₃(x) = f(f(f(x))) = f2(f(x)) f3 := [:x | f2值:(f值:x)]。
     ↪ f₃(1) = f₂(4) = f₁(7) = 10 ↪ f3 值:1 "=> 10"

对于深度 k,只需在原始块的结果上调用 k-1 的块。


解决方案

所以,一个解决方案可能看起来像

BlockClosure>>depth: k
    | closure |
    closure := self.
    k timesRepeat: [ | newClosure |
        newClosure := closure.
        closure := [:x | newClosure value: (self value: x)]].
    ^ closure

你可以像这样调用它:

([:x | x + 3] depth: 0) value: 1. "=> 4"
([:x | x + 3] depth: 1) value: 1. "=> 7"
([:x | x + 3] depth: 2) value: 1. "=> 10"

适应您的需求。

于 2013-04-23T06:48:41.477 回答