我可以使用连接字符串作为函数的参数吗?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />考虑这个简单的例子:
dt2 = 当前数据表();
b = 140;
bc = char(b);
打印(b);
打印(BC);
dt2 << 新列("范围"||bc||"v1",
数字,
式(b)
);
// dt2 = 当前数据表();
dt2 << 新列("范围",
数字,
公式(最大值(:名称("AA"||bc), :名称("BB"||bc), :名称("CC"||bc)) - 最小值(:名称("AA"||bc) , :名称("BB"||bc), :名称("CC"||bc)))
);
这是表:

返回错误消息:

我很少进行 JSL 编程,所以请帮忙!!我希望这个能起作用。
回复:我可以使用连接字符串作为函数的参数吗?哎呀,对此我很抱歉! 深夜JSL编码看起来克雷格确实发现了导致该问题的括号错误,并且还简化了事情(谢谢克雷格!)。
朱利安
回复:我可以使用连接字符串作为函数的参数吗?嗨克雷格,
我会尝试一下。我认为我最终在脚本中使用 Name() 的原因是我将其直接从公式编辑器中复制出来以获得不同的公式。现在我想我看到了括号的问题。
谢谢!
回复:我可以使用连接字符串作为函数的参数吗?嗨朱利安,
我尝试了你的脚本,它似乎部分有效。当我运行它时,我得到了这个:

Range 列下的值应为 5,而不是 15。
日志是这么说的(我不明白):

似乎最大值被正确评估,然后就停在那里。有任何想法吗?感谢您的帮助
脚本:
dt2 = 当前数据表();
b = 140;
bc = char(b);
打印(b);
打印(BC);
dt2 << 新列("偏差"||bc||"v1",
数字,
式(b)
);
// dt2 = 当前数据表();
dt2 << 新列("范围",
数字,
);
评估(解析(评估插入(
“\[
:范围 << 设置公式( 最大值(:名称("^"AA_"||bc^"), :名称("^"BB_"||bc^"), :名称("^"CC_"||bc )^") -
最小值(:名称("^"AA_"||bc^"), :名称("^"BB_"||bc^"), :名称("^"CC_"||bc^"))
)
]\")));
回复:我可以使用连接字符串作为函数的参数吗?朱利安回复后提供了更多信息。
是的,您可以使用串联来构建大多数函数的参数。名字是非常奇怪的例外之一。 Name() 是一个解析时帮助器,而不是运行时函数。
大多数 JSL 变量名称的格式都很好,是字母、数字、下划线和空格的序列,很容易被 JMP 解析器理解。你的名字, AA_140等,结构良好。有时变量名会变得很混乱。通常,这种情况发生在嵌入逗号或减号时: X射线或者苹果、梨。无论如何,您无法在不引用这些变量名的情况下编写 JSL 表达式。 Name() 包装器就是这样做的:
名称(“X射线”)+名称(“苹果,梨”)
会将两个变量加在一起。Name 是在解析 JSL 源代码时处理(而不是执行)的,而不是在执行时处理的。Name 的参数在解析时必须是一个简单的字符串。Julian 的代码使用 JMP 的字符函数来预先构建连接的字符串并将其发送到解析函数。
因为变量名称格式良好(总是一个好主意),所以不需要名称包装器,并且 Julian 的想法可以进一步简化。(这也修复了错误的括号。)
评估(解析(评估插入(
“\[
:范围 << 设置公式(
最大值(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) -
最小值(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) )
]\")));

还有其他 JSL 函数可以直接操作公式,无需构建和解析字符串,但 Julian 的 EvalInsert 想法让您可以在 JSL 中使用友好的字符操作。
回复:我可以使用连接字符串作为函数的参数吗?你好谢赫扎德·卡卡,
我可以通过使用 eval、parse 和 eval insert 构建表达式来实现此目的。 既然您说您是 JSL 新手,我想这看起来会非常神秘,所以让我逐步介绍其中的两个重要部分。
我做的第一件事是将公式设置为它自己的部分,与创建列分开。 这样我们就可以专注于构建一个仅设置列公式的表达式。 其中大部分内容是 Eval(Parse(EvalInsert( )));是在做。EvalInsert 是一个巧妙的工具,用于获取字符串并替换变量或变量的函数。 指定您想要替换的方法是将 ^ ^ 包裹在函数或变量周围。 例如:
g =“世界”;
h = EvalInsert("你好^g^");
标题(h);
在这种情况下,h 等于“hello world”,这就是上面代码将显示在标题框中的内容。
在您的情况下,我使用 evalInsert 作为列名称:
:名称("^"AA_"||bc^")
如果我们把它拆开就会更清楚
:名称(" ^ "AA_" || bc ^ ")
:Name() 函数需要引用文本,因此括号的开头和结尾都有引号。 接下来,我们将 ^ ^ 包裹在您的串联中。 Evalinsert 对其进行处理,并且 :Name() 函数留下带引号的字符串 AA_140。 EvalInsert 将替换所有包含在 ^ ^ 中的内容。 有一个特殊的复杂性,那就是我们正在构建的表达式需要在其中包含引号,但我们必须使用引号来指定字符串本身。 为了处理这个问题,我们可以通过在每个引号前面添加 \! 来告诉 JMP 每个引号实际上是引号字符(而不是 JMP 语法的一部分)。 (slash-bang) 或按照我在下面所做的那样,将 \[ 放在起始引号后面,并将 ]\ 放在最后引号前面。 这“转义”了我们正在构建的表达式中的所有引号。
接下来,Parse() 将字符串转换为 JSL 表达式,最后 Eval() 运行 JSL 表达式,将公式分配给该列。
我希望这有帮助!
朱利安
ps:您的代码没有列名称下划线,所以我添加了这些。
dt2 =当前数据表() ;
乙= 140 ;
公元前=字符(乙) ;
打印(乙) ;
打印(公元前) ;
dt2 <<新专栏( “范围” ||公元前|| “v1” ,
数字,
公式(乙)
) ;
// dt2 = 当前数据表();
dt2 <<新专栏( “范围” ,
数字,
) ;
评估(解析(评估插入(
“\[
:范围 << 设置公式( 最大值(:名称("^"AA_"||bc^"), :名称("^"BB_"||bc^"), :名称("^"CC_"||bc )^") - 最小值(:名称("^"AA_"||bc^"), :名称("^"BB_"||bc^"), :名称("^"CC_"||bc^" ))
)
]\" ))) ;