Implement the of macro

This commit is contained in:
Ryan Gonzalez 2019-10-07 13:14:49 -05:00
parent 1865feb7d6
commit e1ab140a6e
2 changed files with 20 additions and 1 deletions

View File

@ -139,6 +139,20 @@ the second form, the second result is inserted into the third form, and so on."
ret) ret)
(defmacro of [base &rest args]
"Shorthand for indexing for type annotations.
If only one arguments are given, this expands to just that argument. If two arguments are
given, it expands to indexing the first argument via the second. Otherwise, the first argument
is indexed using a tuple of the rest.
E.g. `(of List int)` -> `List[int]`, `(of Dict str str)` -> `Dict[str, str]`."
(if
(empty? args) base
(= (len args) 1) `(get ~base ~@args)
`(get ~base (, ~@args))))
(defmacro if-not [test not-branch &optional yes-branch] (defmacro if-not [test not-branch &optional yes-branch]
"Like `if`, but execute the first branch when the test fails" "Like `if`, but execute the first branch when the test fails"
`(if* (not ~test) ~not-branch ~yes-branch)) `(if* (not ~test) ~not-branch ~yes-branch))

View File

@ -6,7 +6,7 @@
;; conftest.py skips this file when running on Python <3.6. ;; conftest.py skips this file when running on Python <3.6.
(import [asyncio [get-event-loop sleep]]) (import [asyncio [get-event-loop sleep]])
(import [typing [get-type-hints]]) (import [typing [get-type-hints List Dict]])
(defn run-coroutine [coro] (defn run-coroutine [coro]
@ -48,6 +48,11 @@
(assert (= (get annotations "x") int)) (assert (= (get annotations "x") int))
(assert (= (get annotations "z") bool))) (assert (= (get annotations "z") bool)))
(defn test-of []
(assert (= (of str) str))
(assert (= (of List int) (get List int)))
(assert (= (of Dict str str) (get Dict (, str str)))))
(defn test-pep-487 [] (defn test-pep-487 []
(defclass QuestBase [] (defclass QuestBase []
(defn --init-subclass-- [cls swallow &kwargs kwargs] (defn --init-subclass-- [cls swallow &kwargs kwargs]