下村 一毅

lua-users home
wiki

我在考慮寫一本函數式編程教學? :) 這是一個草稿,在建立新分頁之前。我尚未研究現有的資訊。

目前對 lua 的興趣與點子

Lua 的函數式編程、迭代器、產生器和組合器。以及協程的惰性求值。

Lua 的 VM 與位元組代碼。例如,作為 bind2 的實作,注入繫結值在函式的程式碼中(或許是位元組代碼和常數欄位),而不是透過包裝的匿名函式變更引數順序。

目前的問題

我已經複製了所有元素,但我需要的是一個參照。
假設這類比常數,我不會變更表格。

備忘錄:具備原始資料參照的範圍、切片物件,
以及索引資訊。當需要資料時尋找項目。
但由於表格是可變資料,如何得知原始資料已更新。
「自身」可能針對這類主題撰寫了一些論文...

        -- Lua sais: attempt to call global `fact' (a nil value)
        local fact = function(num) if (num > 1) return n*fact(num-1) else return 1 end end
        

        -- this is ok. calls global 'fact'
        fact = function(num) if (num > 1) return n*fact(num-1) else return 1 end end
        

        -- but since the closure depend to global, see code below
        temp = fact
        fact = function (num) return num end
        print(temp(10)) -- temp(10) returns 90
        

這對大家來說並非嚴重的問題,
因為我們很少變更遞迴呼叫函式的名稱。
你只需訂立一個當地規則,例如透過君子協定「不變更函式」。

重點是,函式名稱會在執行時間在全域範圍內查詢。
那是允許從外部範圍影響的空間。

我所知道的解決方案為,
Y 組合器,提供函式自身做為函式的第一個引數。
或類似 Perl6,提供特殊的變數來參照函式自身。

        -- the 'a' in table is nil.
        local a = { a }

        -- what the function f returns ? ... 
        local f = function() return f end 
        

函式中的「f」是在函式建立時的那個 f。
這看起來是正確的,像是當地/靜態範圍行為。
事實上,我認為「let-rec」是繫結遞迴函式的。

程式碼範例


最新異動 · 偏好設定
編輯 · 歷史記錄
最後編輯時間為 2005 年 5 月 20 日下午 3:41 GMT (比對)