Skip to content

Commit 01c8776

Browse files
keywords can now be fully qualified as in clojure
1 parent ea20df6 commit 01c8776

3 files changed

Lines changed: 31 additions & 16 deletions

File tree

pixie/vm/code.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,17 @@ def add_refer_symbol(self, sym, var):
544544
def include_stdlib(self):
545545
stdlib = _ns_registry.find_or_make(u"pixie.stdlib")
546546
self.add_refer(stdlib, refer_all=True)
547+
548+
def resolve_ns(self, ns_alias):
549+
refer = self._refers.get(ns_alias, None)
550+
resolved_ns = None
551+
if refer is not None:
552+
resolved_ns = refer._namespace
553+
if resolved_ns is None:
554+
resolved_ns = _ns_registry.get(ns_alias, None)
555+
if resolved_ns is None:
556+
affirm(False, u"Unable to resolve namespace: " + ns_alias + u" inside namespace " + self._name)
557+
return resolved_ns
547558

548559
def resolve(self, s, use_refers=True):
549560
import pixie.vm.symbol as symbol
@@ -552,14 +563,7 @@ def resolve(self, s, use_refers=True):
552563
name = rt.name(s)
553564

554565
if ns is not None:
555-
refer = self._refers.get(ns, None)
556-
resolved_ns = None
557-
if refer is not None:
558-
resolved_ns = refer._namespace
559-
if resolved_ns is None:
560-
resolved_ns = _ns_registry.get(ns, None)
561-
if resolved_ns is None:
562-
affirm(False, u"Unable to resolve namespace: " + ns + u" inside namespace " + self._name)
566+
resolved_ns = self.resolve_ns(ns)
563567
else:
564568
resolved_ns = self
565569

pixie/vm/reader.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -333,21 +333,24 @@ def invoke(self, rdr, ch):
333333
return cons(symbol(u"quote"), cons(itm))
334334

335335
class KeywordReader(ReaderHandler):
336+
def fqd(self, itm):
337+
ns_alias = rt.namespace(itm)
338+
current_nms = rt.ns.deref()
339+
340+
if ns_alias is None:
341+
return keyword(rt.name(itm), rt.name(current_nms))
342+
else:
343+
ns_fqd = current_nms.resolve_ns(ns_alias)
344+
return keyword(rt.name(itm), rt.name(ns_fqd))
345+
336346
def invoke(self, rdr, ch):
337-
nms = u""
338347
ch = rdr.read()
339348
if ch == u":":
340349
itm = read_inner(rdr, True)
341-
nms = rt.name(rt.ns.deref())
350+
return self.fqd(itm)
342351
else:
343352
rdr.unread()
344353
itm = read_inner(rdr, True)
345-
346-
affirm(isinstance(itm, Symbol), u"Can't keyword quote a non-symbol")
347-
if nms:
348-
affirm(rt.namespace(itm) is None, u"Kewyword cannot have two namespaces")
349-
return keyword(rt.name(itm), nms)
350-
else:
351354
return keyword(rt.name(itm), rt.namespace(itm))
352355

353356
class LiteralStringReader(ReaderHandler):

tests/pixie/tests/test-keywords.pxi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414
(t/assert= (namespace :cat/dog) "cat")
1515
(t/assert= (namespace ::foo) "pixie.tests.test-keywords"))
1616

17+
(t/deftest fqd-keywords
18+
(t/assert-throws? (read-string "::x/bar"))
19+
(t/assert-throws? (read-string "::a.b/foo"))
20+
(refer-ns 'my.other.ns 'my.fake.core 'fake)
21+
(binding [*ns* (the-ns 'my.other.ns)]
22+
(t/assert= :my.fake.core/foo (read-string "::fake/foo"))
23+
(t/assert= :my.fake.core/foo (read-string "::my.fake.core/foo"))
24+
(t/assert-throws? (read-string "::f/foo"))))
1725

1826
(t/deftest keyword-equality
1927
(t/assert= :foo/bar :foo/bar)

0 commit comments

Comments
 (0)