一個名為 Shorty 的新 C++ 庫已經問世,承諾透過更簡潔的語法來簡化 lambda 表示式。這個庫在開發者中引發了相當多的討論,反應從熱情支援到對其可能為已經複雜的語言增加另一層複雜性的恐懼不一。
Shorty 旨在為 C++ 標準 lambda 語法提供一個更簡潔的替代方案,使用美元符號字首如 $lhs
、$rhs
和 $it
來訪問函式引數。這種方法允許開發者為常見操作如排序、過濾和轉換編寫更易讀的程式碼。
美元符號爭議
Shorty 最受討論的方面之一是其在識別符號中使用美元符號($
),多位評論者指出這在 C++ 中並不標準。雖然美元符號自 C 語言早期以來就被許多編譯器作為擴充套件接受,但它並不是官方語言標準的一部分。
「這是一個常見的擴充套件,但它不是標準。C23 和 C++23 只允許識別符號以 Unicode XID_START 字元開頭,這排除了 $。」
庫開發者顯然意識到了這一限制,因為他們的專案包含了抑制這種非標準用法警告的編譯器選項。一些評論者將這一擴充套件追溯到 VMS 系統,暗示這可能是 GCC 最初包含美元符號支援的原因。
表示式模板和前輩
在評論中,幾位開發者認識到 Shorty 並非引入全新概念,而是在 C++ 已建立的技術基礎上進行構建。該庫使用表示式模板,這是一種多年來已在各種 C++ 庫中使用的超程式設計技術。
多位評論者將 Shorty 與之前具有類似目標的庫進行比較,特別是 Boost.Lambda、Boost Lambda2、Boost HOF 和 Boost Hana。然而,有人承認 Shorty 似乎比這些前輩更加功能完備,為引數訪問、函式呼叫和轉換提供了更廣泛的功能。
Shorty 的主要特性
- 引數訪問:
$0
-$9
,$lhs
,$rhs
,$it
,$a
-$f
,$x
,$y
,$z
- 引數查詢:
$argc
,$args
- 捕獲:
$(v)
,$ref(v)
,$value(v)
,$val(v)
,$copy(v)
,$fixed
,$const
- 函式呼叫:
$<callable>(args...)
,$call(args...)
- 型別轉換:
$<T>(expr)
,$cast(expr)
- 元組建立:
($a, $b, $c)
,($0, $1)
- 賦值操作:
$a += 2
, 等等
類似的庫
- Boost.Lambda (已過時)
- Boost Lambda2
- Boost HOF
- Boost Hana
褒貶不一的接受度
社群對 Shorty 的反應揭示了對 C++ 超程式設計和語言擴充套件的不同觀點。一些開發者對該庫的潛力表示興奮,一位評論者承認他們最初不喜歡這種語法,但正在逐漸接受它。其他人則建議他們可能會在使用前將美元符號替換為下劃線,類似於 Boost::Lambda2 的方法。
在另一端,一些開發者將該庫描述為可怕或詛咒,擔心它為 C++ 增加了另一層複雜性。一位評論者特別提到了可能產生更難以理解的錯誤資訊的潛在問題——這是 C++ 開發中一個臭名昭著的痛點,曾經激發了一場比賽,其中獲勝作品產生的錯誤資訊比原始碼大 59 億倍。
儘管有這些批評,一些技術評論者發現,與其他模板超程式設計庫相比,其實現出人意料地可讀性強且結構良好,這表明即使語法選擇仍然存在爭議,這個概念本身可能有其價值。
隨著 C++ 繼續隨著 C++23 等更新標準而發展,像 Shorty 這樣的庫展示了語言純粹性和實用表達力之間的持續張力,這種張力已經成為 C++ 開發數十年來的特點。Shorty 是否會被廣泛採用或僅僅作為一個有趣的實驗,還有待觀察,但它確實激發了關於 C++ 語法未來方向的深思熟慮的討論。