有没有办法传递更高级的东西,比如方法或与函数的比较?
Is there a way to pass something more advanced like a method or a comparison to a function?
所以我试图在 Applescript 中从 Javascript 重新制作一些 Array.prototype
函数。在尝试这样做时我注意到,许多 Javascript 函数使用了我认为称为箭头函数的东西。
以下是我对它的理解的简要回顾:
箭头函数是这样构建的(由 Array.prototype.filter()
方法显示):
words.filter(word => word.length > 6);
^^^ ^^^ ^^^ ^^ ^^^
1 2 3 4 5
示例取自 mozilla.org.
- 这指定了 array/list 目标。易于在 Applescript 中实现。
- 这指定了使用的内置函数。我不知道如何让它工作,因为我不知道如何实施步骤 3、4 和 5。
- 这会将“分配”的值分配给列表中的每个项目。这可以用
repeat with word in words ...
之类的东西静态地完成(除了这些词是保留的。),但我不知道有什么方法可以动态地做到这一点。
- 这是“指示”编译器告诉它应该发生什么的标志。我认为这没有必要实施。
- 这是(在这种情况下)比较,比较给定的单词是否具有更高的字符数 6。这决定了该项目是否应该保留。这可以使用
if count of characters of word > 6 then set end of someNewListWeCreatedOutsideThisLoop to word
. 重新创建
这些箭头函数也可以代替比较,具有类似 forEach()
:
的函数
array1.forEach(element => console.log(element));
示例取自 mozilla.org。
这是我试过的方法:
on myFunc(fn)
fn
end
myFunc(log "Hello World")
这会记录“Hello World”,然后抛出有关传递的参数不足的错误。
这里有一些使用命令行的变通方法:
set theWords to {"These", "are", "Words."}
forEach(theWords, "theWord => display dialog theWord")
on forEach(theArray, arrowFunction)
set AppleScript's text item delimiters to " => "
set arrowFunction to text items of arrowFunction
set AppleScript's text item delimiters to " "
return (do shell script "osascript -e 'repeat with " & item 1 of arrowFunction & " in (every word of \"" & (theArray as string) & "\")' -e '" & item 2 of arrowFunction & "' -e 'end repeat'")
end forEach
这个方法可行,但它的语法很累,执行速度很慢,我几乎可以肯定我忽略了一些时尚的 Applescript 方法。
在脚本对象中包装包含您的自定义行为的处理程序。然后您可以将脚本对象作为参数传递给另一个处理程序并在那里调用它。
script Foo
to doStuff(a, b)
return a + b
end doStuff
end script
to bar(obj)
obj's doStuff(1, 2)
end bar
bar(Foo)
--> 3
预计到达时间:过滤 JavaScript 中的列表:
[1, 4, 6, 2].filter(function (n) {return n < 3})
// [ 1, 2 ]
在 AppleScript 中过滤列表(使用 List 库):
use script "List"
script FilterObj
to filterItem(n)
return n < 3
end filterItem
end script
filter list {1, 4, 6, 2} using FilterObj
--> {1, 2}
AppleScript 更冗长,但它们在功能上是等效的。
所以我试图在 Applescript 中从 Javascript 重新制作一些 Array.prototype
函数。在尝试这样做时我注意到,许多 Javascript 函数使用了我认为称为箭头函数的东西。
以下是我对它的理解的简要回顾:
箭头函数是这样构建的(由 Array.prototype.filter()
方法显示):
words.filter(word => word.length > 6);
^^^ ^^^ ^^^ ^^ ^^^
1 2 3 4 5
示例取自 mozilla.org.
- 这指定了 array/list 目标。易于在 Applescript 中实现。
- 这指定了使用的内置函数。我不知道如何让它工作,因为我不知道如何实施步骤 3、4 和 5。
- 这会将“分配”的值分配给列表中的每个项目。这可以用
repeat with word in words ...
之类的东西静态地完成(除了这些词是保留的。),但我不知道有什么方法可以动态地做到这一点。 - 这是“指示”编译器告诉它应该发生什么的标志。我认为这没有必要实施。
- 这是(在这种情况下)比较,比较给定的单词是否具有更高的字符数 6。这决定了该项目是否应该保留。这可以使用
if count of characters of word > 6 then set end of someNewListWeCreatedOutsideThisLoop to word
. 重新创建
这些箭头函数也可以代替比较,具有类似 forEach()
:
array1.forEach(element => console.log(element));
示例取自 mozilla.org。
这是我试过的方法:
on myFunc(fn)
fn
end
myFunc(log "Hello World")
这会记录“Hello World”,然后抛出有关传递的参数不足的错误。
这里有一些使用命令行的变通方法:
set theWords to {"These", "are", "Words."}
forEach(theWords, "theWord => display dialog theWord")
on forEach(theArray, arrowFunction)
set AppleScript's text item delimiters to " => "
set arrowFunction to text items of arrowFunction
set AppleScript's text item delimiters to " "
return (do shell script "osascript -e 'repeat with " & item 1 of arrowFunction & " in (every word of \"" & (theArray as string) & "\")' -e '" & item 2 of arrowFunction & "' -e 'end repeat'")
end forEach
这个方法可行,但它的语法很累,执行速度很慢,我几乎可以肯定我忽略了一些时尚的 Applescript 方法。
在脚本对象中包装包含您的自定义行为的处理程序。然后您可以将脚本对象作为参数传递给另一个处理程序并在那里调用它。
script Foo
to doStuff(a, b)
return a + b
end doStuff
end script
to bar(obj)
obj's doStuff(1, 2)
end bar
bar(Foo)
--> 3
预计到达时间:过滤 JavaScript 中的列表:
[1, 4, 6, 2].filter(function (n) {return n < 3})
// [ 1, 2 ]
在 AppleScript 中过滤列表(使用 List 库):
use script "List"
script FilterObj
to filterItem(n)
return n < 3
end filterItem
end script
filter list {1, 4, 6, 2} using FilterObj
--> {1, 2}
AppleScript 更冗长,但它们在功能上是等效的。