动态修补(处理创建时传递的变量)有哪些替代方案?
What alternatives are there to dynamic patching (to deal with variables passed at creation time)?
我听说有人将动态补丁描述为有点 hack 或在未来的 Pd 版本中有被破坏的风险。这很合理,但似乎暗示在构建抽象时还有其他选择。
动态修补似乎对于实例化可变数量的对象和连接到可变数量(在创建时定义的数字 - 我个人不需要事后更改,在这个阶段) 抽象中的入口和出口。
现在明白了[克隆]对象可以解决创建对象的问题。我也可以看到循环发送和接收对象可以通过仔细规划解决很多连接问题,但我不明白的是像 [trigger]
、[route]
和 [select]
这样的对象是如何实现的以某种方式调整或更换?我看不出你会如何避免使用动态修补,例如,当你的抽象的创建参数为 2 时创建一个 [trigger f f],而当创建 arg 为 3 时创建一个 [trigger f f f]。同样,与[route]
和 [select]
以及类似的对象。
编辑:原来的问题被认为过于模糊。我后来在评论中提出了一个后续问题,实际上应该在这里。在我看来,碰巧的是,后续的回答很好地回答了原来的问题。因此,总结一下并希望澄清一下,我在构建抽象时使用了一些 "tools" ,这样我就可以尽可能限制动态修补的使用。这些工具原来是:
- 使用发送和接收而不是入口和出口(尽管
[initbang]
可用于在实例化时创建入口和出口)。
- 使用
[clone]
- 使用发送和接收链接触发器、路由和 select 对象 - 例如,使用
[t b b]
- [t b b]
而不是 [t b b b]
。这意味着可以在创建时借助 [clone]
定义这些对象中的参数数量。这在 Pd 邮件列表中进行了讨论。
- 使用
[initbang]
,如下面的答案所示。
在尝试用我对动态修补技术的有限知识构建带有预设和任意数量轨道的鼓机之后,我意识到必须有很多方法来避免我在这样做时遇到的问题,这些问题是一些!当然,有些事情必须用动态补丁来完成,这很好。这只是关于创建可管理的代码。
这实际上是评论中对 "follow-up question" 的回答¹,而不是原始问题(我认为太宽泛而无法回答),
Is there a way to define an abstraction that has an argument that defines how many outlets the abstraction exposes?
当然,只需使用 </code>。</p>
<p>例如<code>[gates 10]
可以创建 10 个网点...
Presumably it could dynamically patch itself, but that doesn't seem like a good idea.
嗯,如果你想让一个抽象有一个动态的API(也就是:可变数量的inlets/outlets),那么就有没有绕过动态修补的方法。
Is this a good case for building your own external?
取决于您实际希望外部执行的操作。
iemguts 库(免责声明:我是作者)拥有一切就绪,可让您动态修补您需要的内容。
最重要的是,有 [initbang]
,用于在 Pd 尝试连接它们之前创建 iolets(如果您使用 [loadbang]
,将在 Pd 无法连接到它们之后创建 iolets)。
它还包括一个 [canvasargs]
对象,它允许您获取抽象的所有参数(例如,它简化了让出口数量等于参数数量的任务 - 如 [trigger]
或 [pack]
)
如果您想将抽象的全部功能包装到外部,那当然也是可能的(并且在 C 领域非常简单)。
另请记住,其他人可能已经编写了您需要的代码。
¹ 请不要滥用 comment
字段来回答 follow-up 问题。更新您的原始问题(如果 follow-up 只是对原始问题的澄清)或 post 一个新问题。
我听说有人将动态补丁描述为有点 hack 或在未来的 Pd 版本中有被破坏的风险。这很合理,但似乎暗示在构建抽象时还有其他选择。
动态修补似乎对于实例化可变数量的对象和连接到可变数量(在创建时定义的数字 - 我个人不需要事后更改,在这个阶段) 抽象中的入口和出口。
现在明白了[克隆]对象可以解决创建对象的问题。我也可以看到循环发送和接收对象可以通过仔细规划解决很多连接问题,但我不明白的是像 [trigger]
、[route]
和 [select]
这样的对象是如何实现的以某种方式调整或更换?我看不出你会如何避免使用动态修补,例如,当你的抽象的创建参数为 2 时创建一个 [trigger f f],而当创建 arg 为 3 时创建一个 [trigger f f f]。同样,与[route]
和 [select]
以及类似的对象。
编辑:原来的问题被认为过于模糊。我后来在评论中提出了一个后续问题,实际上应该在这里。在我看来,碰巧的是,后续的回答很好地回答了原来的问题。因此,总结一下并希望澄清一下,我在构建抽象时使用了一些 "tools" ,这样我就可以尽可能限制动态修补的使用。这些工具原来是:
- 使用发送和接收而不是入口和出口(尽管
[initbang]
可用于在实例化时创建入口和出口)。 - 使用
[clone]
- 使用发送和接收链接触发器、路由和 select 对象 - 例如,使用
[t b b]
-[t b b]
而不是[t b b b]
。这意味着可以在创建时借助[clone]
定义这些对象中的参数数量。这在 Pd 邮件列表中进行了讨论。 - 使用
[initbang]
,如下面的答案所示。
在尝试用我对动态修补技术的有限知识构建带有预设和任意数量轨道的鼓机之后,我意识到必须有很多方法来避免我在这样做时遇到的问题,这些问题是一些!当然,有些事情必须用动态补丁来完成,这很好。这只是关于创建可管理的代码。
这实际上是评论中对 "follow-up question" 的回答¹,而不是原始问题(我认为太宽泛而无法回答),
Is there a way to define an abstraction that has an argument that defines how many outlets the abstraction exposes?
当然,只需使用 </code>。</p>
<p>例如<code>[gates 10]
可以创建 10 个网点...
Presumably it could dynamically patch itself, but that doesn't seem like a good idea.
嗯,如果你想让一个抽象有一个动态的API(也就是:可变数量的inlets/outlets),那么就有没有绕过动态修补的方法。
Is this a good case for building your own external?
取决于您实际希望外部执行的操作。
iemguts 库(免责声明:我是作者)拥有一切就绪,可让您动态修补您需要的内容。
最重要的是,有 [initbang]
,用于在 Pd 尝试连接它们之前创建 iolets(如果您使用 [loadbang]
,将在 Pd 无法连接到它们之后创建 iolets)。
它还包括一个 [canvasargs]
对象,它允许您获取抽象的所有参数(例如,它简化了让出口数量等于参数数量的任务 - 如 [trigger]
或 [pack]
)
如果您想将抽象的全部功能包装到外部,那当然也是可能的(并且在 C 领域非常简单)。 另请记住,其他人可能已经编写了您需要的代码。
¹ 请不要滥用 comment
字段来回答 follow-up 问题。更新您的原始问题(如果 follow-up 只是对原始问题的澄清)或 post 一个新问题。