亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go中的方案解釋器

Go中的方案解釋器

Go
呼喚遠方 2021-10-18 17:10:48
我是一個相當基本的 Go 程序員,我一直在研究這個小型 Scheme 解釋器,我一直試圖了解它是如何工作的。我在這里找到它:https : //pkelchte.wordpress.com/2013/12/31/scm-go/我閱讀了網頁,但我仍在努力理解它是如何工作的,因為源代碼顯然是由比我更熟悉 Go 的人編寫的。特別是我很難理解這些行:e := expression.(type) // Line 73我不確定這.(type)部分是什么意思,我以為它是鑄造的,但它看起來不像我以前見過的鑄造。switch p := procedure.(type) {case func(...scmer) scmer:    value = p(args...)case proc:    en := &env{make(vars), p.en}    switch params := p.params.(type) {    case []scmer:        for i, param := range params {            en.vars[param.(symbol)] = args[i]        }    default:        en.vars[params.(symbol)] = args    }    value = eval(p.body, en)老實說,我真的不明白這些代碼中的任何一個。第 73 - 86 行*tokens = (*tokens)[1:] // Line 208我不確定這一行是什么意思,因為它的語法很奇怪。我知道它的指針和括號是因為 *. 但我不確定那條線在做什么。最后有這些行:token := (*tokens)[0]*tokens = (*tokens)[1:]switch token {case "(": //a list begins    L := make([]scmer, 0)    for (*tokens)[0] != ")" {        if i := readFrom(tokens); i != symbol("") {            L = append(L, i)        }    }    *tokens = (*tokens)[1:]    return L我也不知道這些線是做什么的。第 198 - 209 行這是完整的代碼,如果你想要的話,我知道它有 250 行長,但我真的很感激盡可能多地解釋它的作用。
查看完整描述

2 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

第一個是類型開關。您可以在此處閱讀更多相關信息。

第二個是像 python 中的切片(如果你知道,應該很熟悉)

ls = ls[1:]

我們正在跳過第一項并獲取切片/列表的其余部分。

正如我從您的評論中看到的那樣,我認為這不是試驗 golang 的好起點。


查看完整回答
反對 回復 2021-10-18
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

e := expression.(type)是一個類型斷言。


switch p := procedure.(type) {(帶有以下 case 語句)是一個類型 switch。


*tokens = (*tokens)[1:]是一個切片表達式,改變存儲在 中的值*tokens。


token := (*tokens)[0]       // Set token to first element of tokens slice.

*tokens = (*tokens)[1:]     // Update tokens to remove first element.

switch token {              // Switch on token.

case "(": //a list begins   // If token is "("

    L := make([]scmer, 0)       // Make a new, empty slice.

    for (*tokens)[0] != ")" {   // While the first element of tokens is not ")":

                                    // Read from tokens; if not empty symbol:

        if i := readFrom(tokens); i != symbol("") {

            L = append(L, i)        // Add the token read (in i) to L.

        }

    }

    *tokens = (*tokens)[1:]     // Remove the first element from tokens.

    return L                    // Return the newly created slice.


查看完整回答
反對 回復 2021-10-18
  • 2 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號