[英]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.