Streamlit 的 with st.echo()
這個語法糖相當方便,它能直接將指定區塊的程式碼擷取出來,並以代碼塊的形式呈現。這非常實用,使用者可以即時查看執行中的程式碼。
with st.echo():
st.write('This code will be printed')
假如要讓 Golang 做到這件事,需要:
程式碼嵌入: Golang 需要事先將要執行的程式碼嵌入到二進位文件中。這通常是透過 //go:embed
指令來完成。
呼叫點查找: 程式在執行時,需要透過 runtime.Caller(1)
找到呼叫 tgcomp.Echo
的位置,也就是說,要找出那個包含要被提取的程式碼塊的區塊。
程式碼解析: 找到呼叫點後,需要將該區塊的程式碼解析出來。這部分通常會用到 Golang 內建的 parser 套件,將程式碼解析成抽象語法樹 (AST)。
縮排處理: 解析出來的程式碼可能包含縮排,因此需要進行縮排處理,以確保程式碼的格式正確。
_, filename, line, ok := runtime.Caller(1)
left := line - 1
right := line
for i := line; i < len(codeLines); i++ {
_, err := parser.ParseExpr(strings.Join(codeLines[left:i], "\n"))
if err == nil {
right = i
break
}
}
curCode = strings.Join(removeIndent(codeLines[left+1:right-1]), "\n")
最後使用者就可以這樣使用
//go:embed main.go
var code string
c := tgframe.NewContainer()
tcmisc.Echo(c, code, func() {
tccontent.Text(c, "hello echo")
})