AppleScriptにClosureがない云々という話を見かけることがあります。JavaScript系の人が言っているのをよく見かけます。
ハンドラ内にさらに入れ子状にハンドラを宣言してプライベートなハンドラとして利用するのがclosureである、という説明を見かけました。
そういうものであれば、明確に存在します。Script文で記述するScript Objectです。
ハンドラ内に記述したScript文でScript Objectの宣言を行い、ハンドラ内でプライベートなサブハンドラを列挙することもできますし、外部に記述して論理分割することもできます。
実際に、巨大なScript同士を(何も考えずに)つないで使うような場合に重宝しています。
プライベートなハンドラをハンドラ内に入れ子状に作成したScript(本サンプルScriptのようなもの)については、たしかにinnerFunc1やinnerFunc2はメイン側(一番外側)からは直接呼び出すことはできないので、プライベートな関数のような扱いを行えます。便利かもしれないし、それほどでもない感じもします。
このあたりは個人の「趣味」の世界なので、そういう構造にしたい人はすればいいし、したくない人はしなければよいのではないでしょうか。
AppleScript名:closure1 |
set a to mainHander("ABC") of me –> "ABCABC….ABCABC" on mainHander(aParameter) script aClosure on innerFunc1(aParameter) set a to aParameter & aParameter return a end innerFunc1 on innerFunc2(aParameter) set a to aParameter & "…." & aParameter return a end innerFunc2 end script set a to innerFunc1(aParameter) of aClosure set b to innerFunc2(a) of aClosure return b end mainHander |
Cocoaの機能を利用するAppleScriptObjCの宣言を行った場合でも、同様にハンドラ内のScript Object内にさらにプライベートハンドラを記述する記法はコンパイル(=構文確認)を通るようです。
AppleScript名:closure2 |
— – Created by: Takaaki Naganoya – Created on: 2019/01/04 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions set a to mainHander("ABC") of me –> "ABCABC….ABCABC" on mainHander(aParameter) script aClosure on innerFunc1(aParameter) set a to aParameter & aParameter return a end innerFunc1 on innerFunc2(aParameter) set a to aParameter & "…." & aParameter return a end innerFunc2 end script set a to innerFunc1(aParameter) of aClosure set b to innerFunc2(a) of aClosure return b end mainHander |
More from my site
(Visited 96 times, 1 visits today)
Handle diff v2 – AppleScriptの穴 says:
[…] ただし、1つのAppleScript書類内にScript Object(JavaScriptでいうところのClosureみたいなもの)で論理分割された同名のハンドラが複数回登場するパターンは想定していません。複数検出する […]