【问题标题】:Is there a way to have constants in Applescript?有没有办法在 Applescript 中有常量?
【发布时间】:2021-10-03 14:15:03
【问题描述】:

我目前正在开发一个模仿 python math 模块的 Applescript 数学库。 python math 模块有一些常量,如Euler's number 等。目前,您可以执行以下操作:

set math to script "Math"

log math's E -- logs (*2.718281828459*)

set math's E to 10

log math's E -- logs (*10*)

所以我尝试搜索 Applescript 常量并遇到了 the official documentation,其中提到了 You cannot define constants in scripts; constants can be defined only by applications and by AppleScript.

是否有一个聪明的解决方法或者我必须为这种事情编写一个 .sdef 文件?

编辑:

我现在也试过这个:

log pi -- logs (*3.14159265359*)

set pi to 10

log pi -- logs (*10*)

pi 是一个 Applescript 常量。如果您再次运行脚本而不再次编译,它看起来像这样:

log pi -- logs (*10*)

set pi to 10

log pi -- logs (*10*)

我不想模仿这种行为,但更想模仿askyesno 等其他常量的行为,它们会抱怨,即使您尝试将它们设置为自己。

【问题讨论】:

    标签: constants applescript


    【解决方案1】:

    没有办法在 AppleScript 中显式定义常量。根据您要达到的目标,三种方法可能就足够了。


    如果您在库中使用脚本定义 (sdef),则可以添加枚举来定义要保留的术语,然后在代码中按大小写处理它们。例如,如果您想为术语“tau”、“gamma”和“lambda”分配常量值,您可以像这样定义枚举:

    <enumeration name="Constants" code="CVal" description="defined constant values.">
        <enumerator name="tau" code="tau&" description="tau constant."/>
        <enumerator name="gamma" code="gam&" description="gamma constant."/>
        <enumerator name="lambda" code="lmd!" description="lambda constant."/>
    </enumeration>
    

    然后在代码中有一个处理程序来解决它们,并在需要时调用它:

    to resolveConstant(cnst)
        if cnst is tau then
            return pi/2
        else if cnst is gamma then 
            return 17.4683
        else if cnst is lambda then 
            return "wallabies forever"
        else
            return missing value
        end
    end resolveConstant
    

    为每个常量创建处理程序,并将它们作为函数调用:

    on tau()
        return pi/2
    end tau
    
    set x to 2 * tau() * 3^2 -- x = 28.2743
    

    如果您想要 true 常量,您将不得不放弃脚本库并编写不露面的后台应用程序(如系统事件或图像事件)。从最终用户的角度来看,这不会有太大的不同,只是他们必须授权运行应用程序,但这可能意味着您最终需要大量增加劳动力。

    【讨论】:

    • 您的第一种方法对我来说听起来最好,我将如何将脚本定义实现到库中?我需要将其存储为捆绑包吗?
    • @gurkensaas:从MacOSXAutomation article on script libraries 开始,然后工作或跳转到名为“带有术语的库”的页面。是的,它必须是一个脚本包(所以你有地方放置 sdef 文件),但说明非常简单。
    • 我一直关注他们在 MacOSXAutomation 上发布的视频,直到 Creating a Bundle step,然后我尝试编译捆绑包。错误消息显示my dictionary 已损坏。我不知道为什么,你能看看它还是我应该发布一个新问题?
    • @gurkensaas:sdef 对我来说看起来不错:我没有看到任何常见的 plist 错误(尖括号丢失、引号丢失、结束标签缺失或放错位置等)。纯文本编辑器(如 BBEDit)来制作文件?有时人们使用富文本编辑器或文字处理器,它们会通过奇怪的空白字符,这些字符无法被 Script Editor 看到但无法处理。请注意,TextEdit有富文本和纯文本两种模式,你必须确保你不在 RT 中。
    • 我在 XML 模式下使用了 VSCode,它不会导致任何空白字符。该文件也可以在脚本编辑器中打开并以正常方式显示信息。
    【解决方案2】:

    每个带有参数的处理程序名称在 AppleScript 中都是常量。你可以利用这个事实。在这里,您无法更改处理程序的名称,因此您可以将其视为常量 pi 标识符。它是真正的常量,因为您无法设置它,但您可以随心所欲地获取它:

    on constantPi()
        3.14159265359
    end constantPi
    
    get constantPi() --> 3.14159265359
    set constantPi() to 10 --> Access not allowed
    

    注意:不要删除最后一行代码中的括号,否则你会创建额外的变量 constantPi 而不是你的“常量”

    【讨论】:

    • 括号看起来很不自然。我希望最终用户拥有最好的体验。我不需要提醒我不能更改变量,但我计划分发代码。我当然知道你的做法。
    • 请查看my question before this one,告诉我我不知道。
    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 2013-08-31
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多