Commit Graph

15 Commits (ae7fcdbc1ac6d4905cd9743aab4c02e45941eeae)

Author SHA1 Message Date
Mike Gerwitz ae7fcdbc1a
rebirth: Correct recursive fnmap form definitions
There were some instances where fnmap forms defined themselves in terms of
themselves (e.g. `if' using `if'), or defined themselves in terms of one of
their dependents (`let*' used `let' which uses `let*').

They work just fine because of how we're just transpiling directly into JS,
but we're converting them into macros, and we're going to run into issues
once we do that.

This was never intentional---I didn't realize that I was doing it.

* build-aux/bootstrap/rebirth.scm (fnmap)[if, let*]: Fix definitions.
2017-12-14 23:50:46 -05:00
Mike Gerwitz 1060247f0b
prebirth, birth, rebirth: Consistently use "es" instead of "js"
I've been torn on this for a bit, but we're using "es" (ECMAScript) in a lot
of important places.  Thinks like "js:console" I was considering leaving
because "console" is not an ECMAScript thing---it is JavaScript.  But now we
will take "es:" to mean "outputting in ECMAScript".

* build-aux/bootstrap/birth.scm, build-aux/bootstrap/rebirth.scm,
  build-aux/bootstrap/prebirth.js:
    s/js:/es:/g.
* build-aux/bootstrap/libprebirth.js: s/\$\$js\$/\$\$es\$/g.
2017-12-12 01:03:37 -05:00
Mike Gerwitz 462d99fb99
rebirth: Add define/define-macro rest support
That is: `(define (foo bar . rest))'.

* build-aux/bootstrap/rebirth.scm (params->es): Add rest support.
2017-12-12 00:46:18 -05:00
Mike Gerwitz 1d6756a709
rebirth: Add define-macro
This provides preliminary support for traditional Lisp macros, _not_ Scheme
macros as we know them today; this implementation is easy to implement, and
gives us a great foundation for moving forward.

There are caveats to this simple and naive implementation, documented
ad nauseam.  It's probably worth a read if you're studying Rebirth in any
level of detail for whatever reason.

This is a pretty exciting change---it liberates us from rigid compiler
changes and will allow us to rewrite fnmap into macros almost as-is.  The
change is fairly elegant, all things considered---the amount of code is
minimal; most of the change consists of comments describing it and its
caveats.  This is a defining step in Rebirth, and brings it a step closer to
being an actual Lisp rather than a fragment of one.  (Though I still don't
know if Rebirth Lisp will ever actually be a full Lisp.  Please hold the
arguments about Scheme not being a Lisp or I'll respond very immaturely with
"your mom is not a Lisp", and we'll both be very confused and somewhat
offended by one-another, with a net loss overall.  Oh, wait, you're actually
reading this?)

Anyway, changes:

* build-aux/bootstrap/rebirth.scm: Some rephrasing of toplevel comments,
    and addition of macro comments.
  (_macros): New ECMAScript variable.
  (cdfn-macro, macro-compile-result, list->ast): New procedures.  Little
    full of comments.  Lots of sap.
  (parse-lisp): Fix typo.  Add third argument to `cdfn-proc' (#f).
  (cdfn-proc): Add third argument `id-override'.  Use it in place of token
    value, if set.  Remove semicolon from generated ES function (it was
    unneeded to begin with) so that it can be used in macro ES expressions.
  (macro?): New procedure, conditional based on availability of
    `string->es'.
  (apply-proc-or-macro): New procedure.  Conditionally apply macro during
    compiler runtime or compile output for a procedure application.
  (fnmap)[define-macro]: Apply `cdfn-macro'.  This will try to apply it even
    if the procedure isn't defined yet (e.g. first Rebirth pass), so don't
    call it until then!
    [else]: Use `apply-proc-or-macro'.
2017-12-11 22:43:29 -05:00
Mike Gerwitz 0a1e530a76
rebirth: Extend `cond-expand' to dynamically support features
This will crudely detect "features" by seeing if the requested feature is a
definition.  Ideally that definition would be a procedure, but we don't
check for that.  This does what we need it to do.

Obviously this is a poor implementation and will not persist past Rebirth.

* build-aux/bootstrap/rebirth.scm (es:defined?): New procedure.
  (expand-cond-expand): New procedure.  If first Rebirth pass, only support
    `string->es' and `else'; otherwise detect features using `es:defined?'.
  (fnmap)[cond-expand]: Use it.
2017-12-11 22:36:22 -05:00
Mike Gerwitz 0b0003578b
rebirth: Add `unquote@' alias for `unquote-splicing'
Since we don't have reader support for ",@", this will have to do for now.

* build-aux/bootstrap/rebirth.scm (%quote-maybe): Add `unquote@'.
    Rename from `-quote-maybe'.
  (%sexp-maybe-type): Rename from `-sexp-maybe-type'.
2017-12-11 22:32:32 -05:00
Mike Gerwitz f183ccb2b0
rebirth: Properly `quote' strings
Make sure quoted strings are, well, strings---they need their delimiters!

* build-aux/bootstrap/rebirth.scm (quote-sexp): Proper handling of strings.
2017-12-11 22:26:02 -05:00
Mike Gerwitz f18322fbe5
birth, rebirth: Correct *->ecmascript procedure names
They were just out of date, having been copied from Prebirth.

* build-aux/bootstrap/birth.scm
  (prebirth->ecmascript, birth>ecmascript): Former renamed to latter.
* build-aux/bootstrap/rebirth.scm
  (prebirth->ecmascript, rebirth>ecmascript): Former renamed to latter.
2017-12-09 23:43:33 -05:00
Mike Gerwitz 0f9b034a82
rebirth: Unencapsulate all procedures
Many of the procedures were encapsulated within `prebirth->ecmascript';
these have been moved out so that they can be accessed by other procedures,
allowing me to organize the code how I please.

Which also makes me realize that the procedure name is incorrect.

* build-aux/bootstrap/rebirth.scm: Move all procedures out of
    `prebirth->ecmascript'.
2017-12-09 23:43:22 -05:00
Mike Gerwitz a839301a12
rebirth: Make quote form recursive, add quasiquote
This was pretty much a prerequisite for introducing macros (in commits to
follow)---the code would otherwise be far too verbose.

Note that this does _not_ introduce the shorthand forms ("'", "`", ",",
",@"), as implementing those in a reasonable manner would require
preprocesing the AST, which is not what I want to focus on right now.  So
macros will still be a bit verbose, using the full
"(quasiquote ... (unquote-splicing ...))" and such instead of simply
"`(... ,@(...))"

* build-aux/bootstrap/rebirth.scm
  (quote-sexp, quasiquote-sexp): Add procedures.
  (fnmap)[quote]: Use `quote-sexp'.
    [quasiquote]: Add special form.
2017-12-06 22:48:16 -05:00
Mike Gerwitz 4585203a22
rebirth: Remove libprebirth.js dependency
This re-implements libprebirth in Rebirth Lisp, finally cutting the
cord.  (Are these birth puns getting out of control?)  We are finally purely
in Lisp land!

* build-aux/bootstrap/rebirth.scm: Define libprebith primitives when
    `string->es' is available (using `cond-expand').
  (prebirth->ecmascript): Do not include `libprebirth.js' in output.
2017-12-05 00:50:29 -05:00
Mike Gerwitz 7f7a9704e5
prebirth,birth,rebirth: Permit newlines in strings
This modifies each of the three lexers just to avoid confusion, even
though prebirth has no need for it.  Birth does have a need, however, since
rebirth will contain newlines---despite the relevant rebirth code (next
commit) not being expanded, it still has to go through the lexer, which
otherwise errors out.

* build-aux/bootstrap/birth.scm (lex): Permit newlines in string regex.
* build-aux/bootstrap/prebirth.js (lex): Permit newlines in string regex.
* build-aux/bootstrap/rebirth.scm (lex): Permit newlines in string regex.
2017-12-05 00:47:26 -05:00
Mike Gerwitz 639948da02
birth,rebirth: Add cond-expand, string->es
`cond-expand' allows moving forward with implementing features based on the
current bootstrapped state of the system---rebirth will be able to
recursively compile itself and introduce new features along the way.

`string->es' allows outputting raw ECMAScript, which gives us more control
over the code that is generated without having to hard-code it in the
compiler itself.

* build-aux/bootstrap/birth.scm
  (fnmap)[cond-expand]: Always yield the empty string (do nothing).
* build-aux/bootstrap/rebirth.scm
  (fnmap)[cond-expand]: Expand `string->es' only.
  (fnmap)[string->es]: Add macro.
2017-12-05 00:38:39 -05:00
Mike Gerwitz 53ea5c5f4d
rebirth: Add variable definitions (define)
`define' can now be used to define values in addition to the procedure
short-hand.

* build-aux/bootstrap/rebirth.scm
  (cdfn): New procedure.  Renamed original `cdfn' to `cdfn-proc'.
  (cdfn-var): New procedure.
  (cdfn-proc): Renamed from `cdfn'.
2017-12-05 00:32:40 -05:00
Mike Gerwitz 1810fb7c38
rebirth: Copy from birth.scm
See diff for comments as to why this fork exists.

build-aux/bootstrap/rebirth.scm: New file, copied from `birth.scm'.
2017-11-12 00:53:32 -05:00