This repo contains programs written in Source, developed for SICP JS and other educational projects.
All programs in this repository are runnable in the Source Academy playground: copy the program into the editor, choose "Source §4", and press "Run".
The evaluators in this section all follow the general style of SICP JS Chapter 4.
src/evaluators/source-0.js: evaluator for Source §0 (calculator language)
Some classic problems, solved in Source.
src/classics/permutations.js: permutations of a listsrc/classics/sorting_lists.js: some list sorting functionssrc/classics/subsets.js: compute all subsets of a list
The steppers in this section implement a small-step semantics, following the substitution model of SICP JS Chapter 1 and 2.
src/steppers/source-0.js: stepper for Source §0
The type checkers in this section follow a rule-based static semantics available in doc/type-checking.pdf.
src/type-checkers/source-0.js: type checker for Source §0
The virtual machines in this section are SECD-style and follow a description in doc/virtual-machines.pdf. Each virtual machine comes with a compiler, implemented in the same file.
src/virtual-machines/source-0.js: virtual machine for Source §0 (calculator language)
(click to run; for actual sources, go to src/tool-demos/)
src/tool-demos/stepper.js: stepper tool (small-step semantics, based on substitution)src/tool-demos/box-and-pointer-diagrams.js: box-and-pointer diagram visualizer for pairs and lists (following SICP JS chapter 2)src/tool-demos/environment-model.js: environment model visualizer (following SICP JS chapter 3)
(click to run; for actual sources, go to src/module-demos/)
src/module-demos/runes.js: the "picture language" of SICP JS 2.2.4src/module-demos/twist.js: some fun with the "picture language"src/module-demos/curves.js: a "curves" library for drawing curves with functional programmingsrc/module-demos/times.js: visual times tables using the "curves" librarysrc/module-demos/sounds.js: a "sounds" library for generating sounds and music, starting from their constituent sine wavessrc/module-demos/bohemian.js: Bohemian Rhapsody cover using the "sounds" library
src/test/framework/main.js: test framework for Source programs, written in Source §4
[requires bash (any version) and awk (BSD awk 20070501); does not work with gawk]
For testing your Source programs, you need node and yarn.
Write your test cases in a folder __tests__ in each src subfolder. The name of the file specifies the targeted Source of your test case. For example, if src/steppers/source-0.js is the Source, a test case might be src/steppers/__tests__/source-0.test1.js.
Only the tests written will be run.
Each test case is appended to your Source, and then run with js-slang (using Source §4). The last line of the test case is a // comment that must contain the expected result. For example, a stepper test case may be:
parse_and_evaluate("! (1 === 1 && 2 > 3);");
// trueBefore you can run the tests, you need to install js-slang by typing:
% yarn
% yarn installRun all test cases by typing:
% yarn testFor failure cases (where you program is to throw error, e.g. memory exhausted error for virtual machines), you can include the error message as per normal. The lastest JS-Slang already throws the error message explicitly, without letting the underlying TypeScript handling it. Hence, an error message
Line 2073: Error: memory exhausted despite garbage collection undefinedcan be written in the test file:
// Line 2073: Error: memory exhausted despite garbage collection undefinedor
// Error: memory exhausted despite garbage collection undefinedwhere only the part that starts from Error: will be compared. Line number is be ignored as it varies. If line number is needed for a particular reason, it can be appended to the back.
Integration of the
testscript withsrc/test/framework/is pending a fix to the--variantparameter; any help appreciated.
All JavaScript programs in this repository are licensed under the
GNU General Public License Version 3.