簡體   English   中英

不存在的 hy 宏運行斷言,但其他一切都失敗了

[英]Non-existent hy macros runs assertions, but fails appropriately with everything else

在以下代碼中:

(eval-and-compile (import os hy))
(eval-and-compile (import pathlib [Path]))
; (defmacro with-cwd [dir #* body]
;           (setv cwd (hy.gensym))
;           `(let [ ~cwd (.cwd Path) ]
;                 (try (.chdir os ~dir)
;                      ~@body
;                      (finally (.chdir os ~cwd)))))
(setv cookies (/ (.cwd Path) "cookies"))

; This fails with an `AssertionError'
(with-cwd cookies (assert (= (.cwd Path) cookies)))

; This fails with a `NameError'
(with-cwd cookies (.cwd Path))

同樣,任何依賴於缺失宏的函數或宏都會以同樣的方式出錯,例如,如果我正在導入或需要依賴於缺失宏的函數或宏,也會發生同樣的事情; 基本上,我必須手動導入或需要函數或宏及其依賴項。

這是一個錯誤,還是我錯過了關於 Python / Hy 斷言順序的一些東西? 我預計第一個案例也會因NameError而失敗。

這是一個記錄在案的怪癖

與許多編程語言一樣,但與 Python 不同的是,Hy 並不保證在所有情況下計算函數參數的順序。 更一般地,未指定hy.models.Sequence的子模型的評估順序。 例如, (f (g) (h))可能在(g)之前評估 (part of) (h) ,特別是如果f是一個函數而h是一個產生 Python 級語句的宏。 因此,如果您需要確保首先調用g ,請在f之前調用它。

在這種情況下, assert語句已從函數調用中提取出來( (with-cmd …)是一個函數調用,因為沒有名為with-cmd宏)並在符號with-cmd本身之前進行評估。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM