我认为我正在尝试做的正确描述是能够将表达式或函数/处理程序作为参数/参数传递给另一个处理程序。在接收处理程序中要评估的一些代码。我认为类似于 Javascript callbacks。
例如,像这样:
on waitFor(theConditionExpression)
timeout_start(5) -- start a 5 second timer
repeat until (theConditionExpression or timeout_isExpired())
delay 0.1
end repeat
return theConditionExpression
end waitFor
theConditionExpression
应该是一些表达式或函数,其计算结果为布尔结果。- 与问题无关,但仅供参考,
timeout_start(…)
和timeout_isExpired()
是我编写的两个简单的处理程序,它们完全按照他们所说的去做。 (…start()
不返回任何内容,…isExpired()
返回布尔值)。
当然,通常如果我传入一些布尔表达式,它会在我传入时评估该表达式一次。但我希望它每次在处理程序内的代码中引用它时都对其进行评估。
某些语言(不确定 AS)具有某种 eval() 函数,您可以将一些代码作为字符串传递给它,它会将该字符串作为代码执行。理论上可以解决这个问题,但是:(a)我不知道 AS 是否有类似的东西,但即使有,(b)由于各种原因(性能、注入风险等),它是不想要的
所以我在想一些更像例如的东西。 JavaScript 将函数(命名或匿名)作为函数参数/参数传递的能力,可以在循环中的每次迭代等中重新评估(例如,像 JS 的 Array.sort(compareFn) 中的 compareFn
参数)。
AS 可以做这样的事情吗?如果可以,怎么做?
谢谢!
回答1
我将建议(形式上)带有 on idle
处理程序的 AppleScript 应用程序通常是比重复/延迟循环更好的等待条件解决方案。它对系统更有效,并且不会冻结脚本。但这将涉及重新概念化您的脚本,鉴于您形成问题的方式,我不确定它是否会在这种情况下起作用。
有一个古老但很好的网站,叫做 http://www.apeth.net/matt/unm/asph.html,它展示了一系列巧妙地使用 AppleScript 处理程序的技巧:将处理程序作为 values 或参数传递;在处理程序中创建脚本对象;制作闭包和构造函数。我很确定您的请求的答案就在那里。 a您可能想要设置一堆作为条件表达式的处理程序,然后将它们作为参数传递给评估处理程序。或者您可能想要设置一个包含条件处理程序的脚本对象并根据需要调用它?
无论如何,看看你能用它做什么,如果遇到问题,可以提出更具体的问题。