gpt4 book ai didi

arguments - Smalltalk:使用 block 作为 block 参数?

转载 作者:行者123 更新时间:2023-12-01 12:45:45 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

如在

[: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].

不可能通过修改现有 block 来实现这一点。然而,我们可以尝试用另一种方式解决这个问题。

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

function                           block                    f(x) = x + 3                       f := [:x | x + 3].      ↪ f(1) = 4                        ↪ f value: 1 "=> 4"f₁(x) = f(x)                       f1 := [:x | f value: x].     ↪ f₁(1) = f(1) = 4                ↪ f1 value: 1 "=> 4"f₂(x) = f(f(x)) = f₁(f(x))         f2 := [:x | f1 value: (f value: x)].     ↪ f₂(1) = f₁(4) = 7               ↪ f2 value: 1 "=> 7"f₃(x) = f(f(f(x))) = f₂(f(x))      f3 := [:x | f2 value: (f value: x)].     ↪ f₃(1) = f₂(4) = f₁(7) = 10       ↪ f3 value: 1 "=> 10"

For depth k, just invoke the block of k-1 on the result of the original block.


Solution

So, a solution can look like

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"

适应您的需求。

关于arguments - Smalltalk:使用 block 作为 block 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16159546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com