author | Alan Dipert
<alan@dipert.org> 2020-04-17 15:41:50 UTC |
committer | Alan Dipert
<alan@dipert.org> 2020-04-17 15:41:50 UTC |
parent | 60f096742d9dbcb11f2b584adbc87de1bd4ba773 |
Makefile | +20 | -0 |
index.html.m4 | +18 | -0 |
index.md | +22 | -0 |
repl-client/jacl => jacl | +0 | -0 |
repl-client/jacl-client.R => jacl-client.R | +0 | -0 |
index.html => jacl.html | +0 | -0 |
{paper => papers}/.gitignore | +0 | -0 |
{paper => papers}/ACM-Reference-Format.bst | +0 | -0 |
{paper => papers}/Makefile | +0 | -0 |
{paper => papers}/acmart.cls | +0 | -0 |
{paper => papers}/jacl-demo-els-2020.tex | +29 | -28 |
{paper => papers}/jacl-els-2020.bib | +0 | -0 |
{paper => papers}/jacl-els-2020.tex | +0 | -0 |
style.css | +30 | -0 |
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0c6d8eb --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +.PHONY: all clean + +SHELL := /bin/bash +DIST_FILES := RUN.md jacl.html boot.lisp jacl-tests.lisp qunit-2.9.2.css qunit-2.9.2.js jacl jacl-client.R + +%.html: %.html.m4 %.md + m4 $< > $@ + +all: jacl-dist.zip index.html + +jacl-dist.zip: $(DIST_FILES) + rm -f $@ + mkdir -p $(basename $@) + cp -R $^ $(basename $@) + zip $@ -r $(basename $@) + +clean: + rm -f jacl-dist.zip + rm -rf jacl-dist + rm -f index.html diff --git a/index.html.m4 b/index.html.m4 new file mode 100644 index 0000000..fed1949 --- /dev/null +++ b/index.html.m4 @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>JavaScript Assisted Common Lisp</title> + <link rel="stylesheet" href="style.css"/> +</head> + +<body> + <header> + <h1>JACL: JavaScript Assisted Common Lisp</h1> + </header> + esyscmd(`pandoc index.md') +</body> +<footer>Last updated: esyscmd(`date')</footer> +</html> diff --git a/index.md b/index.md new file mode 100644 index 0000000..31b35e8 --- /dev/null +++ b/index.md @@ -0,0 +1,22 @@ +JACL is an experimental Lisp system for the Web browser platform in +early development. It was created by [Alan +Dipert](https://tailrecursion.com/~alan) to explore new techniques for +developing large-scale SPAs (Single Page Application) in Lisp. + +If you are interested in following JACL development progress, you may +sign up for the [JACL News](https://tinyletter.com/alandipert) e-mail +list to receive short, infrequent updates. Please don't hesitate to +direct any comments or questions about JACL you may have to the author +at [alan@dipert.org](mailto:alan@dipert.org). + +## Resources + +* [jacl-dist.zip](jacl-dist.zip) is the JACL distribution. It includes + usage instructions and source code. Source code is available under + the terms of the [MIT + License](https://opensource.org/licenses/MIT). Note that JACL is in + an early and primitive state and that application development is not + yet practical. +* [jacl-demo-els-2020.pdf](papers/jacl-demo-els-2020.pdf) explains the + motivation behind JACL, demonstrates its capabilities, and outlines + future work. diff --git a/repl-client/jacl b/jacl similarity index 100% rename from repl-client/jacl rename to jacl diff --git a/repl-client/jacl-client.R b/jacl-client.R similarity index 100% rename from repl-client/jacl-client.R rename to jacl-client.R diff --git a/index.html b/jacl.html similarity index 100% rename from index.html rename to jacl.html diff --git a/paper/.gitignore b/papers/.gitignore similarity index 100% rename from paper/.gitignore rename to papers/.gitignore diff --git a/paper/ACM-Reference-Format.bst b/papers/ACM-Reference-Format.bst similarity index 100% rename from paper/ACM-Reference-Format.bst rename to papers/ACM-Reference-Format.bst diff --git a/paper/Makefile b/papers/Makefile similarity index 100% rename from paper/Makefile rename to papers/Makefile diff --git a/paper/acmart.cls b/papers/acmart.cls similarity index 100% rename from paper/acmart.cls rename to papers/acmart.cls diff --git a/paper/jacl-demo-els-2020.tex b/papers/jacl-demo-els-2020.tex similarity index 89% rename from paper/jacl-demo-els-2020.tex rename to papers/jacl-demo-els-2020.tex index 608c7a2..0596d89 100644 --- a/paper/jacl-demo-els-2020.tex +++ b/papers/jacl-demo-els-2020.tex @@ -84,14 +84,11 @@ JACL. Lisps that have either demonstrated industrial utility or that implement a significant subset of Common Lisp are surveyed in appendix \ref{appendix:lisps}. Like many of these related efforts, JACL includes an online, optimizing compiler and supports interoperation -with JavaScript. These Lisps, and most other SPA implementation -languages, are delivered as tools primarily designed to be run in the -host environment, instead of in the target Web browser environment -where compiled applications ultimately do. JACL distinguishes itself -from these efforts by placing special emphasis on the value of -\emph{residential} development style, where both applications and the -tools used to create them co-evolve in a shared environment. JACL -provides fundamental support for residential development with its +with JavaScript. JACL distinguishes itself from these efforts by +placing special emphasis on the value of \emph{residential} +development style, where both applications and the tools used to +create them co-evolve in a shared environment. JACL provides +fundamental support for residential development with its \emph{asynchronous reader}. \section{Interoperation with JavaScript} @@ -125,9 +122,8 @@ and Valtan\cite{valtanGitHub} make the same tradeoff. JACL functions are JavaScript functions, and may be invoked by JavaScript callbacks without a special calling convention. JavaScript functions named as Lisp values may be invoked with \texttt{FUNCALL} or -\texttt{APPLY}. As opposed to JSCL, neither arguments nor return -values are automatically coerced to or from any particular set of -object types. +\texttt{APPLY}. Neither arguments nor return values are automatically +coerced to or from any particular set of object types. \subsection{Operators} @@ -212,28 +208,28 @@ browser. Development of JACL itself is currently driven primarily by modifying \texttt{jacl.js} and the \texttt{boot.lisp} and -\texttt{jacl-tests.lisp} Lisp scripts. The Lisp test scripts are -included in the \texttt{index.html} file in the JACL +\texttt{jacl-tests.lisp} Lisp scripts. The Lisp scripts are included +in the \texttt{jacl.html} file in the JACL distribution\cite{JACLDistribution}. After each modification, the Web browser is reloaded, and test results are displayed. -This workflow is characteristic of the traditional JavaScript -development workflow and has served JACL development so far. However, -it requires runtime parsing and compilation of JACL source code, among -other inefficiencies. Reloading the Web browser also destroys the -entire runtime environment. +This Lisp script-based workflow is similar to the traditional +JavaScript development workflow and has served JACL development so +far. However, Lisp scripts require runtime parsing and compilation of +JACL source code, among other inefficiencies. Reloading the Web +browser also destroys the entire runtime environment. The easiest way to create JACL programs in this manner is to start -with the \texttt{index.html} Web page provided by JACL and then modify +with the \texttt{jacl.html} Web page provided by JACL and then modify it by removing or adding new Lisp scripts. It is imagined that ultimately, Lisp sources will be incorporated into the Lisp \emph{image} exclusively by the REPL client tool. An arrangement such as this decouples source code loading from the Web browser lifecycle. Production executables may then be produced at any -time from the Lisp image by a Lisp function in a manner similar to the -\texttt{SAVE-LISP-AND-DIE}\cite{SBCLManual} function in SBCL or the -\texttt{DELIVER}\cite{LispWorksDeliver} function in LispWorks. +time from the Lisp image using a Lisp function in a manner similar to +the \texttt{SAVE-LISP-AND-DIE}\cite{SBCLManual} function in SBCL or +the \texttt{DELIVER}\cite{LispWorksDeliver} function in LispWorks. \subsection{REPL} @@ -284,12 +280,17 @@ integrating the REPL into the development workflow. \section{Future Work} JACL currently lacks many basic Common Lisp data types, functions, and -operators, and the resulting programming experience is challenging and -wholly impractical. JACL should support as much of Common Lisp as is -possible, accounting for the brutal limitations imposed by JavaScript -and the Web platform. Fortunately, the many other existing Common -Lisps that compile to JavaScript demonstrate that a compelling -implementation \emph{is} possible. +operators. Ultimately, JACL should support as much of Common Lisp as +is possible, accounting for the severe limitations imposed by +JavaScript and the Web platform. Fortunately, the many other existing +Common Lisps that compile to JavaScript demonstrate that a compelling +implementation is achievable. + +An in-browser REPL and other tools for interacting with the JACL +runtime in the Web browser would be desirable. Such tools could +optionally remain as parts of deployed applications and provide a +degree of introspection and extension capability even after the +application has been deployed. Other than work related to missing features such as multiple values, CLOS, and the conditions system, much design work remains with regard diff --git a/paper/jacl-els-2020.bib b/papers/jacl-els-2020.bib similarity index 100% rename from paper/jacl-els-2020.bib rename to papers/jacl-els-2020.bib diff --git a/paper/jacl-els-2020.tex b/papers/jacl-els-2020.tex similarity index 100% rename from paper/jacl-els-2020.tex rename to papers/jacl-els-2020.tex diff --git a/style.css b/style.css new file mode 100644 index 0000000..fe070eb --- /dev/null +++ b/style.css @@ -0,0 +1,30 @@ +body { + margin: 40px auto; + max-width: 800px; + line-height: 1.4; + font-size: 1.1em; + padding: 1em; + /* background-color: #eee; */ + /* border-radius: 18px; */ + /* border: 1px solid #aaa; */ + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +h1 { + text-align: center; +} + +h1,h2,h3 { + font-family: serif; + font-weight: lighter; + color: #cc3b12; +} + +header > h1 { + margin-top: 0; +} + +footer { + text-align: center; + font-style: italic; +}