gpt4 book ai didi

function - 如何用细化来包装一个函数,这样就不需要细化了?

转载 作者:行者123 更新时间:2023-12-04 21:16:13 26 4
gpt4 key购买 nike

我试图以通用的方式用细化来包装函数,这样它们就可以在没有细化的情况下被调用。例如,ARRAY-INITIAL size value而不是 ARRAY/INITIAL size value

wrap: function [refined [path!] args [block!]] [
function args compose [
(refined) (args)
]
]

array-initial wrap 'array/initial [size value]

不会太花哨。似乎一般都可以工作,但是如果您使用函数调用它,这会有些奇怪:
>> n: 0 array/initial 4 does [++ n] 
== [10 11 12 13]

>> n: 10 array-initial 4 does [++ n]
== [10 10 10 10]

当我 source我明白了:
>> source array-initial 
array-initial: make function! [[size value][array/initial size value]]

好的,所以发生的事情是在包装器中调用了该函数,并且传递了调用的结果……而不是函数。一种解决方法是使用 get-word 来避免评估:
>> array-initial-2: function [size value] [array/initial size :value]

>> array-initial-2: 10 array-initial-2 4 does [++ n]
[10 11 12 13]

但我正在寻找一种通用的方法。在不发生这种情况的情况下代理参数的最佳方法是什么?

最佳答案

我相信一般的方法是您必须考虑在函数参数中使用单词以及传递给函数的方式。

wrap: func [
'refined [path!]
args [block!]
][
func map-each arg args [
either get-word? :arg [to word! arg] [:arg]
] compose [
(refined) (
map-each arg args [
either lit-word? :arg [to get-word! arg] [:arg]
]
)
]
]

这里有两个问题——定义函数的词和传递给函数的词。前者有两种主要形式: 单词! 对于普通参数和 亮字! 对于文字参数。在我们的规范中,如果我们有 得到字! 参数,我们希望它们是普通参数并转换为 单词! .当谈到传递参数时,我们也有两种形式: 单词! 评估参数和 得到字! 传递单词指向的值。如果我们的规范处理 亮字! ,我们需要传递一个 得到字! 作为 单词! 将按字面传递。

希望这一切都有意义!

无论如何,这是如何发挥作用的:
wrapped-foobar: wrap foo/bar ['literal evaluated :referred]

我们有三种类型,第一种允许您按字面意思传递值——例如不使用亮词的单词;第二个在传递之前评估参数;第三个将传递引用的值——这种形式允许你传递函数。你最终得到:
make function! [
['literal evaluated referred] [
foo/bar :literal evaluated :referred
]
]

现在喜欢 数组/初始 正在:
array-initial: wrap array/initial [size :value]
n: 1
array-initial 4 does [++ n]

关于function - 如何用细化来包装一个函数,这样就不需要细化了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892499/

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