如何使用 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 代碼中保留註釋和空格. 請務必點贊以表示您的支持。 我將確保開發人員了解這種需求。