Skip to main content

Command Palette

Search for a command to run...

Meta and meta-programming

Published
1 min read

「我的語言的界限,就是我的世界的界限。」 -- Ludwig Wittgenstein

最近在讀 meta-programming 的東西,翻到一些網路上的爭論。想到幾年前,一個通曉多國語言的日本朋友問我:「meta-programming 裡的 meta 這個字在台灣怎麼翻?」,那時我是麼回的:「有時候翻中介,有時候翻後設,有時就乾脆不翻了。」

我認為 meta 的翻譯,就是爭論的來源。

無論是把 "meta-programming" 翻成「中介編程」,還是把 "meta-fiction" 翻成「後設小說」,在字面上都只是讓我更困惑而己。meta 這個字其實很有趣,基本上就是「關於 X 的 X」。舉幾個例子:

  • 卡爾維諾的「如果在冬夜,一個旅人」,是本講述一些人在讀小說的過程的小說,這叫 meta-fiction。
  • 「我們手邊的使用者資料正確性有多高」這個數字,本身也是一個資料。所謂 meta-data,就是是關於資料的資料(data about data)。

所以你現在一眼看到「六個尋找作者的劇中人」這個劇本,還有「Design of design」,就知道它們一付 meta 樣。


回頭來看 meta-programming ,幫我們產生/修改程式的程式只是 meta-programming 的其中一部份而己。若用「關於程式的程式」來理解,「將程式碼本身當做資料在操作的程式」才是 meta-programming 的全貌。來個最近學到的超無用程式範例:

class Suprise < (rand < 0.5 ? Hash : Array)
end

sup = Surprise.new
sup[0] = 'wow!'
p sup #可能是陣列 ["wow!"],也可能是Hash { 0 => "wow!" }

第一行的後半段,我們將 Hash 或是 Array 這兩個類別當做資料在操作,Surprise各有 50% 的機會繼承 Hash 或是 Array。我認為這是不產生/修改程式碼的 meta-programming 好範例。另外提一下,如果你在 production code 裡用了這個技巧,千萬不要說是我教你的。

看一下 JavaScript 這個對 meta-programming 非常友善的語言,由於物件跟 Hash 是同一種東西,因此我們把使用 ["string"] 的形式動態的從物件中調值視為理所當然。在其它的語言中,這件事並非總是這麼簡單。

Ruby 還可以輕鬆的用 send() 解決:

obj.send(:method_name)

在 Java 裡就得大費周章的使用 reflaction:

MyClass.class.getMethod("methodName").invoke(someArgs)

再來看看 JavaScript 頗受壞評的 eval:

eval("function magic(){ alert('rabbit!'); }");
magic();

所以當資料與程式碼的界限開始模糊的時候,你知道你已經跨進 meta-programming 的界限裡了。你也該知道,這一段程式碼要是出錯了,在 debug 時可能沒那麼容易。


那時我回問了我朋友:「那你覺得有什麼比較好的翻法嗎?」朋友說:「我覺得翻成"元編程"跟"元資料"蠻不錯的。」 想了想,我也這麼覺得。

More from this blog

聊聊 Elixir 中的 type

最近有幾位朋友分別來問 Elixir 的 type 的問題,想說中文世界好像沒有比較完整的東西,就把知道的東西整理出來。 (目前) Elixir 的 type 能做什麼? tl;dr: 最主要是文件,然後在某種程度下防止錯誤。 我覺得這應該是在研究 Elixir 的 type 時最需要知道的事情了。不像 Haskell 及 F# 這種以型別著稱的 ML 系語言,Elixir / Erlang 本質上是個動態語言,所有與型別有關的標註都會被編譯器忽略。而 Erlang 內建的型別檢查工具 dia...

Oct 18, 20222 min read

Steam 上的程式教學類遊戲

農曆年期間比較有空,玩了一些之前買的遊戲。這次特別試了幾個標榜讓不會寫程式的人學寫程式的遊戲。分享一下試玩的心得。 1. 7 Billion Humans 考慮到劇情的話我最喜歡的是 7 Billion Humans。它用拖拉語法的方式下指令,一開始還蠻好上手的,但是因為只有 goto 那樣的結構,而操作的時候又是一次對所有的 worker 下指令,所以常常要想一下執行後每個人運作的順序。但是介面有正體中文,以「想要體驗一下寫程式大概是怎麼一回事」來說還蠻適合的。 2. while Tru...

Feb 24, 20201 min read

Let's (re)start from here.

最近的時間大半都花在這上面了。 算算應該是第五次弄部落格系統。算一下扣除上古時期用現成的之外,每個系統平均各寫六篇文章,也都撐不過兩年。前幾個分別用了 Refinery CMS -> jekyll -> middleman -> jekyll。想來架系統的總時數應該超過寫文章的時間 XD 而這次用上了 Gatsby + tailwindcss,除了恢復一下 GraphQL 的手感之外,這次還挑戰了不套別人做的版型,自己把類似上一個部落格的 style 刻出來。想說來分享一下這些技術的感想: G...

Jan 11, 20201 min read

Mostly Functional

31 posts

/.(ex|jsx?|rb|hs|rs|py)/, A father, a bookworm, a pluviophile. Co-organizer of http://Elixir.tw. Learning Satir, coaching & mediation.

Meta and meta-programming