如何使用 New Script () 保留格式和注释?大家好,
又是我。 另一天,另一个问题:)
所以我做了一个很好的长脚本来创建一个包含一些脚本的新数据表。 我使用 New Script() 函数来执行此操作。
dt<< New script ("myscript",
// comments
//beautiful indentation
(
(
( ( instructions) )
)
)
)
);
我的问题是,当我检查表 dt 内的脚本时,所有注释以及布局、我个人的缩进风格、空行等都丢失了。
这些脚本适用于不一定熟悉 JSL 的用户,因此我需要保留注释和原始布局。
我试图做一些事情,比如将我的脚本放在一个字符串中并使用 Append() 或 Append Text() 但没有成功。
mystring = " \[ // all my
// script
]\" ;
myscript = dt<<NEW script=""></NEW>不幸的是,这没有用。 有任何想法吗 ? 一些使用 Expr/Eval 等的技巧?
回复:如何使用 New Script () 保持格式和注释?好吧,好吧,看来我们赢了!
我喜欢你花几天时间研究一个看似不可能解决的问题,然后有人将解决方案揭示为一行脚本:face_with_tears_of_joy:
多谢@XanGregg 
回复:如何使用 New Script () 保持格式和注释?JSL Quote() 可能会有所帮助:
New Table( "formatted script",
New Script( "my script",
Eval( Parse(JSL Quote(
// example
x = 1;
Print( :column 1[1], y );
) )
)
),
New Column( "Column 1", Set Values( [5] ) )
)
回复:如何使用 New Script () 保持格式和注释?你说, ”据我所知,没有办法在数据表中引用脚本,这就是问题所在。 我的意思是没有数据表:myscript 或 datatable< “ 在运行上面的示例代码后,您可以将此消息发送到数据表:
dt << Get Script( "My Script" );
现在我可以使用表达式或字符串函数从数据表中编辑脚本。
回复:如何使用 New Script () 保持格式和注释?你好@马克贝利,
感谢这段代码,它确实很有用。
这样就解决了一点:脚本窗口的内容可以保存到脚本中。
但是,第一部分似乎仍然是正确的“JMP 脚本不能被另一个脚本编辑”。 你提供的脚本每次用New Script()函数写一个新的脚本;
据我所知,没有办法在数据表中引用脚本,这就是问题所在。 我的意思是没有数据表:myscript 或 datatable<
人们所能做的就是复制脚本,然后将它们复制到一个新脚本中。 但是,实际上这并不能解决问题,因为它将它转换为 JSL 表达式,删除过程中的注释和格式。
我认为是时候承认目前没有解决方案了。 它在 JMP 愿望清单中,因此@Jeff_Perkinson提到,
大家有兴趣请一定要工藤在附加到数据的 JSL 代码中保留注释和空白!!
回复:如何使用 New Script () 保持格式和注释?表脚本可以运行以这种方式保存的脚本。
Include( "My Path/My Script.jsl" );
您可以将脚本放在任何地方(例如,单个存储库文件夹)并包含完整路径。
回复:如何使用 New Script () 保持格式和注释?你说, ”看起来 JMP 脚本不能被其他脚本编辑。 我试图在窗口内的脚本框中编写脚本。但据我所知,脚本框的内容不能保存到数据表中。 “
有可能的。 这可能并不明显。 不过,它需要的脚本编写技术并不基本。 这里有一个例子来说明它是如何完成的。 它
Names Default to Here( 1 );
script window = New Window( "Script", << Modal,
sb = Script Box( "print(\!"Hello\!");" ),
H List Box(
Button Box( "OK", s = sb << Get Lines ),
Button Box( "Cancel" )
)
);
If( script window["Button"] == -1,
Throw( "User cancelled" );
);
Print( s );
n = N Items( s );
script = s[1];
For( line = 2, line <= n, line++,
script ||= "\!n" || s[line];
);
Print( script );
Eval( Parse( script ) );
Eval(
Substitute(
Expr( Current Data Table() << New Script( "My Script", sss ) ),
Expr( sss ),
Parse( script )
)
);
但是,表脚本会丢失格式,因为 Parse() 函数会丢弃它,就像 JSL 解释器一样。 所以这个例子并不能解决你原来的问题。
回复:如何使用 New Script () 保持格式和注释?谢谢马克贝利,
这是一段有用的代码。 我想可以将 .jsl 文件保存在与它们一起使用的数据表相同的文件夹中。 那将是一种合理的做事方式。回复:如何使用 New Script () 保持格式和注释?我们在关于脚本的 JMP 培训课程中遇到了这个问题。 我们强加了一种特定的样式和格式以使代码尽可能清晰,因此我们希望始终对其进行维护。 我们的解决方案是利用为每门课程创建的 JMP 期刊。 我们为课程中提供的每个脚本添加了一个按钮。 按钮脚本将格式化后的脚本作为字符串存储在脚本文件中,然后打开或运行。 这是一个非常简单的例子来说明日志按钮的作用:
script = "dt = Open( \!"$SAMPLE_DATA/Big Class.jmp\!" );
dist = dt << Distribution( Y( :weight, :height ) );";
Save Text File( "My Script.jsl", script );
Open( "My Script.jsl" );
该解决方案非常适合我们在培训中的目的。 不过,我认为这不会对您有所帮助。
回复:如何使用 New Script () 保持格式和注释?更新 :
看起来 JMP 脚本不能被其他脚本编辑。 我试图在窗口内的脚本框中编写脚本。但据我所知,脚本框的内容不能保存到数据表中。
看起来这毕竟是行不通的。
不过有几个半生不熟的备份选项:
- 通过使用 \[...]\,我可以将我的脚本作为文本字符串保存到数据表中。 然后用户可以去看看评论。 他们还可以将该字符串复制并粘贴到新脚本中,并获取原始布局和注释。 虽然不是很好,因为它需要用户的一些输入。
- 另一个后备选项是在脚本中创建一个评论功能,将评论打印到日志中。 也不是很好的选择,因为默认情况下,从数据表运行的脚本没有内置日志。
- 或者我可以将我的源代码作为 word 或 pdf 文档中的资源提供。
还有其他想法,见解吗?
回复:如何使用 New Script () 保持格式和注释?谢谢杰夫,
我担心这就是答案。 但是我觉得可能有一个 DIY 解决方案可以绕过这个......
例如,我尝试将我所有的脚本放入一个 Expr () 语句并且它导出正常。 当然在最终的脚本中,一切都还在 Expr 的括号内。
但也许文本编辑脚本可以读取此内容并删除 Expr 和括号以获得原始文本?
所以我的问题是,这可能吗? 一个脚本可以用这种方式编辑另一个脚本吗?
或者我可以将数据表的脚本另存为单独的 .jsl 文件,然后让表自动导入它们?
来吧,一定有办法做到这一点 
回复:如何使用 New Script () 保持格式和注释?遗憾的是,JMP 并未设计为保留附加到数据表的脚本的注释和格式。 这已在 JMP 愿望清单中提出:在 JSL 代码中保留注释和空格. 请务必点赞以表示您的支持。 我将确保开发人员了解这种需求。