Skip to content

Commit 18fc7a9

Browse files
authored
Support Reader Conditional syntax (#409)
* Support Reader Conditional syntax * Fix Reader Conditional splicing * Merge error * Updates to allow creation of new venvs * Clean up * Some tests * Some test fixes * Full tests * Lisp representation tests * Fix everything maybe hopefully plz
1 parent 26bc0db commit 18fc7a9

File tree

6 files changed

+434
-55
lines changed

6 files changed

+434
-55
lines changed

Pipfile.lock

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/basilisp/cli.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ def eval_file(filename: str, ctx: compiler.CompilerContext, module: types.Module
5656
"""Evaluate a file with the given name into a Python module AST node."""
5757
last = None
5858
for form in reader.read_file(filename, resolver=runtime.resolve_alias):
59+
assert not isinstance(form, reader.ReaderConditional)
5960
last = compiler.compile_and_exec_form(form, ctx, module)
6061
return last
6162

@@ -64,6 +65,7 @@ def eval_stream(stream, ctx: compiler.CompilerContext, module: types.ModuleType)
6465
"""Evaluate the forms in stdin into a Python module AST node."""
6566
last = None
6667
for form in reader.read(stream, resolver=runtime.resolve_alias):
68+
assert not isinstance(form, reader.ReaderConditional)
6769
last = compiler.compile_and_exec_form(form, ctx, module)
6870
return last
6971

@@ -72,6 +74,7 @@ def eval_str(s: str, ctx: compiler.CompilerContext, module: types.ModuleType, eo
7274
"""Evaluate the forms in a string into a Python module AST node."""
7375
last = eof
7476
for form in reader.read_str(s, resolver=runtime.resolve_alias, eof=eof):
77+
assert not isinstance(form, reader.ReaderConditional)
7578
last = compiler.compile_and_exec_form(form, ctx, module)
7679
return last
7780

src/basilisp/core.lpy

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2172,7 +2172,11 @@
21722172
(:eof opts)
21732173
(if (= (:eof opts) :eofthrow)
21742174
true
2175-
false)))))
2175+
false)
2176+
(:features opts)
2177+
(if (= :preserve (:read-cond opts))
2178+
false
2179+
true)))))
21762180

21772181
(defn read
21782182
"Read the next form from the stream. If no stream is specified, uses
@@ -2195,7 +2199,11 @@
21952199
(:eof opts)
21962200
(if (= (:eof opts) :eofthrow)
21972201
true
2198-
false))))
2202+
false)
2203+
(:features opts)
2204+
(if (= :preserve (:read-cond opts))
2205+
false
2206+
true))))
21992207
([stream eof-error? eof-value]
22002208
(first (basilisp.lang.reader/read stream
22012209
*resolver*

src/basilisp/importer.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
from functools import lru_cache
99
from importlib.abc import MetaPathFinder, SourceLoader
1010
from importlib.machinery import ModuleSpec
11-
from typing import List, Mapping, MutableMapping, Optional
11+
from typing import Iterable, List, Mapping, MutableMapping, Optional, cast
1212

1313
import basilisp.lang.compiler as compiler
1414
import basilisp.lang.reader as reader
1515
import basilisp.lang.runtime as runtime
16+
from basilisp.lang.typing import ReaderForm
1617
from basilisp.lang.util import demunge
1718
from basilisp.util import timed
1819

@@ -278,7 +279,13 @@ def add_bytecode(bytecode: types.CodeType):
278279
all_bytecode.append(bytecode)
279280

280281
logger.debug(f"Reading and compiling Basilisp module '{fullname}'")
281-
forms = reader.read_file(filename, resolver=runtime.resolve_alias)
282+
# Cast to basic ReaderForm since the reader can never return a reader conditional
283+
# form unprocessed in internal usage. There are reader settings which permit
284+
# callers to leave unprocessed reader conditionals in the stream, however.
285+
forms = cast(
286+
Iterable[ReaderForm],
287+
reader.read_file(filename, resolver=runtime.resolve_alias),
288+
)
282289
compiler.compile_module( # pylint: disable=unexpected-keyword-arg
283290
forms,
284291
compiler.CompilerContext(filename=filename),

0 commit comments

Comments
 (0)