Передача по ссылке в AppleScript’е
ЭплСкрипт, конечно, очень странный язык. С одной стороны, ребята явно старались сделать программирование похожим на написание текста на естественном (английском) языке, с другой стороны, все кишочки спрятать не удалось. Любимые мои грабли — это передача значений по ссылке.
У этой штуки есть одна особенность, которую надо знать. Код ниже перебирает список и выводит в консоль всякую информацию об единственном элементе, который в списке содержится:
repeat with itm in {false}
log itm -- Выведет «false»
log class of itm -- Выведет «boolean»
log itm is false -- Выведет… «false», хм
log itm is true -- И снова «false»
end repeat
Непонятно, да? Элемент булевского типа, но не «истина» и не «ложь», как так? Дело в том, что этот элемент — ссылка. И прежде чем его с чем-то сравнивать, надо получить его значение. Вот так нормально:
repeat with itm in {false}
log contents of itm is false -- Выведет «true»
end repeat
Контринтуитивно и неясно какую пользу это приносит, но вот так сделано.
Это можно использовать для изменения элементов массива в цикле. В Perl сделано похоже, но там сравнения будут работать.
Комментарий для Denis Ibaev:
Я не про ссылку (ссылки там полезны, конечно, пока я Тетрис писал, их неявно использовал), а про то, что ссылка — это специальный объект, который не равняется по значению тому, на что он ссылается. Это слишком похоже на Си и неясно с какой целью так сделано.
AppleScript -- это Кобол, «повторённый как фарс»? (Или уже как американский фильм?)
(Из «История повторяется* дважды: первый раз в виде трагедии, второй — в виде фарса.
И третий -- как американский фильм».)
*Ясно, что в первый раз она ещё не повторяется.