按价值论证未在 Praat 中传递

Argument by value not being passed in Praat

我用 Praat 脚本制作了一个程序,如下所示:

procedure segment_allowed: .segment$
    appendInfoLine: "The argument I got was: ", .segment$
    .yes = 0
    for i from 1 to allowed_segments_size
        if allowed_segments$[i] = .segment$
            .yes = 1
        endif
    endfor
endproc

它基本上是试图找出 .segment$ 是否存在于全局数组 allowed_segments$.

这样调用的函数:

call segment_allowed segment_label$

总是输出:

The argument I got was segment_label$

为什么 function/procedure 不获取实际值并将变量视为字符串?

您将旧语法 ("shorthand") 和新语法混合在一起,这是令人困惑的事情。

当您编写 call segment_allowed segment_label$ 时,您使用的是 "shorthand",在这种情况下(已弃用)语法样式变量不会自动插入。如果你想使用那种风格,你应该写

call segment_allowed 'segment_label$'

强制插值。

一种更好的方法是使用新语法(您在过程定义中使用的语法),它可以进行更明智的变量插值。使用这种新语法(从大约 5.4 版开始可用),您的过程调用应该是

@segment_allowed: segment_label$

哪个应该做你想做的。

顺便说一句,将您当前的过程调用翻译成这种更容易理解的新语法,您调用的是

@segment_allowed: "segment_label$"

另请注意,for 循环中的 from 1 是多余的,因为这是默认值。如果您感兴趣的只是知道该段是否存在,您可以在找到匹配项时从循环中中断,就像这样(我还将您的 i 更改为 .i,以保持整洁):

procedure segment_allowed: .segment$
    appendInfoLine: "The argument I got was: ", .segment$
    .yes = 0
    for .i to allowed_segments_size
        if allowed_segments$[.i] = .segment$
            .yes = 1
            .i += allowed_segments_size
        endif
    endfor
endproc