外部計算判讀協定 0.9
沒有任何一個來源天生比較大。
這套協定拒絕在快取、求值器與外部引擎之間指定一個永久勝者。它只判讀三者之間的關係,再由判讀結果決定接下來允許發生什麼。
證據模型
對一個公式儲存格 c,協定同時持有三份讀數。
- K(c)
- 檔內存著的 OOXML 快取 —— 上一個寫入的應用程式留在檔案裡的值。
- M(c)
- 在 AST 白名單下算出的限界 MMR 結果。
- E(c)
- 獨立外部引擎算出的結果。
協定不定義 E > M > K 這種永久性的全域排序。那種排序是把一項政策打扮成事實。
九種判讀類別
每個公式儲存格恰好落在其中一種。
| 判讀類別 | 關係 | 授權什麼 |
|---|---|---|
three_way_agreement | K = M = E | 無需動作。 |
cache_stale_engines_agree | M = E ≠ K | 使快取失效,寫入另一份安全副本。 |
cache_missing_engines_agree | K = ∅,M = E | 無需動作。 |
external_only_cache_agrees | M 不支援,K = E | 無需動作。 |
mmr_semantic_gap | K = E ≠ M | 僅送覆核。 |
external_semantic_gap | K = M ≠ E | 僅送覆核。 |
external_date_system_gap | 日期系統與 E 的結果衝突 | 僅送覆核。 |
error_agreement | 所有來源落在同一錯誤類別 | 無需動作。 |
engine_disagreement_review | 不存在安全共識 | 僅送覆核。 |
寫入政策
九種之中只有一種會打開寫入 —— 而且那次寫入還是寫進另一份安全副本,動到的是快取值而不是公式。
授權
cache_stale_engines_agree 可授權在另一份安全副本中使快取失效。
永不
它不授權改寫公式。所有語意落差與日期系統落差一律僅送覆核。
結構化參照橋接
外部引擎無法直接解析 Table[Column] 形式的公式。橋接器把結構化參照展開為等價的 A1 範圍,同時保留已定義名稱,並記錄每一條被轉換過的公式。
僅覆核
正規化成功不等於原生語法支援。
引擎環境清單
每個結果都記下它是在什麼條件下產生的,這樣日後重播才分得出「真正的語意落差」與「環境變了」。
- 引擎與版本。
- Python 版本與平台。
- 地區設定與小數點符號。
- 時區。
- 活頁簿日期系統。
- 活頁簿計算模式。
- 是否需要正規化,以及正規化了幾次。
外部引擎是什麼
一份由別人寫的獨立實作,有它自己的臭蟲,也有它自己的涵蓋範圍。
它不是什麼
它不是 Microsoft Excel。跟它一致,不足以建立普遍的 Excel 相容性。