Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
9b7ff07
Take copying gc as base
dingyuchen Apr 7, 2020
a5fe1f3
Fix bugs with mark and other functions
dingyuchen Apr 8, 2020
42bfeb5
Fix bug with overflow allocation.
dingyuchen Apr 8, 2020
fac130e
Add heap visualizer
dingyuchen Apr 8, 2020
a00c362
Update and fix bug in heap visualizer
dingyuchen Apr 16, 2020
e30df5f
Merge branch 'master' into ding/mark-region-in-source-2
dingyuchen Apr 17, 2020
6ab4fc6
Add assertions and reference implementations for mark-region
dingyuchen Apr 17, 2020
3c9b3a0
Add assertions for bump pointer restoration
dingyuchen Apr 19, 2020
5bfef36
Update copy_rts to be inclusive of TOP_RTS
dingyuchen Apr 19, 2020
88fdcc0
Skip MARK loop if node has already been marked
dingyuchen Apr 19, 2020
03a7e4f
Fix issue with freeing new env node during CALL
dingyuchen Apr 19, 2020
936bf91
Fix mark reference implementation to ignore old bump pointers during
dingyuchen Apr 19, 2020
b2d264c
Merge branch 'ding/impl-mark-region-in-source-1' into ding/mark-regio…
dingyuchen Apr 20, 2020
ee52c22
Merge branch 'ding/impl-mark-region-in-source-1' into ding/mark-regio…
dingyuchen Apr 24, 2020
750d316
Group debugging functions together
dingyuchen Apr 24, 2020
2da7c9c
Update source 2 mark region with bug fixes and assertions
dingyuchen Apr 24, 2020
1dcadfb
Fix bugs with register conflict and last env node
dingyuchen Apr 24, 2020
9914dc5
Fix dirty register for CALLVAR
dingyuchen Apr 24, 2020
7e8a799
Fix wrong number-of-argument bugs in variadic functions
dingyuchen Apr 24, 2020
1e831b6
Fix bug for LDV
dingyuchen Apr 24, 2020
bbb6357
Fix example programs for Source 2 and changed root ENV to -Infinity
dingyuchen Apr 27, 2020
8680b68
Update stack overflow assertion in Source 2
dingyuchen Apr 27, 2020
a94b116
Merge branch 'master' into ding/mark-region-in-source-2
dingyuchen Apr 28, 2020
99b8441
Fix stack overflow and add new test cases for mark region source 2
dingyuchen Apr 28, 2020
a305914
Add permutations test to source 2
dingyuchen Apr 28, 2020
b1ef2be
Merge remote-tracking branch 'upstream/master' into ding/mark-region-…
dingyuchen Apr 28, 2020
22981cc
Merge branch 'master' into ding/mark-region-in-source-2
martin-henz May 12, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 40 additions & 39 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,69 +1,71 @@
# Source Programs

This repo contains programs written in [Source](https://en.wikipedia.org/wiki/Source_(programming_language)), developed for [SICP JS](https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs,_JavaScript_Adaptation) and other educational projects.
This repo contains programs written in [Source](<https://en.wikipedia.org/wiki/Source_(programming_language)>), developed for [SICP JS](https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs,_JavaScript_Adaptation) and other educational projects.

All programs in this repository are runnable in the [Source Academy playground](https://sourceacademy.nus.edu.sg/playground#chap=4): copy the program into the editor, choose "Source §4", and press "Run".

## Evaluators

The evaluators in this section all follow the general style of SICP JS Chapter 4.

* [`src/evaluators/source-0.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-0.js): evaluator for Source §0 (calculator language)
* [`src/evaluators/source-0-pp.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-0-pp.js): evaluator for Source §0++ (calculator language plus conditionals, blocks and sequences)
* [`src/evaluators/source-2.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-2.js): evaluator for Source §2, described in SICP JS 4.1
* [`src/evaluators/source-2-lazy.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-2-lazy.js): lazy evaluator for Source §2, described in SICP JS 4.2
* [`src/evaluators/source-2-non-det.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-2-non-det.js): evaluator for Source §2 with non-determinism, described in SICP JS 4.3
* [`src/evaluators/typed-source.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/typed-source.js): evaluator for Typed Source (typed version of a Source §1 sublanguage)
- [`src/evaluators/source-0.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-0.js): evaluator for Source §0 (calculator language)
- [`src/evaluators/source-0-pp.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-0-pp.js): evaluator for Source §0++ (calculator language plus conditionals, blocks and sequences)
- [`src/evaluators/source-2.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-2.js): evaluator for Source §2, described in SICP JS 4.1
- [`src/evaluators/source-2-lazy.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-2-lazy.js): lazy evaluator for Source §2, described in SICP JS 4.2
- [`src/evaluators/source-2-non-det.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/source-2-non-det.js): evaluator for Source §2 with non-determinism, described in SICP JS 4.3
- [`src/evaluators/typed-source.js`](https://github.com/source-academy/source-programs/blob/master/src/evaluators/typed-source.js): evaluator for Typed Source (typed version of a Source §1 sublanguage)

## Steppers

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`](https://github.com/source-academy/source-programs/blob/master/src/steppers/source-0.js): stepper for Source §0
- [`src/steppers/source-0.js`](https://github.com/source-academy/source-programs/blob/master/src/steppers/source-0.js): stepper for Source §0

## Type checkers

The type checkers in this section follow a rule-based static semantics available in [doc/type-checking.pdf](https://github.com/source-academy/source-programs/blob/master/doc/type-checking.pdf).

* [`src/type-checkers/source-0.js`](https://github.com/source-academy/source-programs/blob/master/): type checker for Source §0
* [`src/type-checkers/typed-source.js`](https://github.com/source-academy/source-programs/blob/master/src/type-checkers/source-0.js): type checker for Typed Source, a typed version of a Source §1 sublanguage
- [`src/type-checkers/source-0.js`](https://github.com/source-academy/source-programs/blob/master/): type checker for Source §0
- [`src/type-checkers/typed-source.js`](https://github.com/source-academy/source-programs/blob/master/src/type-checkers/source-0.js): type checker for Typed Source, a typed version of a Source §1 sublanguage

## Virtual machines

The virtual machines in this section are SECD-style and follow a description in [doc/virtual-machines.pdf](https://github.com/source-academy/source-programs/blob/master/doc/virtual-machines.pdf). Each virtual machine comes with a compiler, implemented in the same file.

* [`src/virtual-machines/source-0m.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-0m.js): virtual machine for Source §0- (calculator language without division)
* [`src/virtual-machines/source-0.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-0.js): virtual machine for Source §0 (calculator language)
* [`src/virtual-machines/source-0p.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-0p.js): virtual machine for Source §0 (calculator language with conditionals)
* [`src/virtual-machines/source-1.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-1.js): virtual machine for a Source §1 sublanguage (without memory management)
* [`src/virtual-machines/source-1-with-copying-gc.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-1-with-copying-gc.js): virtual machine for a Source §1 sublanguage with a Cheney-style stop-and-copy garbage collector
* [`src/virtual-machines/register-machine-gcd.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/register-machine-gcd.js): register machine following SICP JS Section 5.2, using GCD example
* [`src/virtual-machines/source-2.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-2.js): virtual machine for a Source §2 sublanguage (without memory management)
* [`src/virtual-machines/source-2-with-copying-gc.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-2-with-copying-gc.js): virtual machine for a Source §2 sublanguage with a Cheney-style stop-and-copy garbage collector
* [`src/virtual-machines/source-2-with-ms-gc.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-2-with-ms-gc.js): virtual machine for a Source §2 sublanguage with a Mark-and-Sweep-style garbage collector
- [`src/virtual-machines/source-0m.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-0m.js): virtual machine for Source §0- (calculator language without division)
- [`src/virtual-machines/source-0.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-0.js): virtual machine for Source §0 (calculator language)
- [`src/virtual-machines/source-0p.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-0p.js): virtual machine for Source §0 (calculator language with conditionals)
- [`src/virtual-machines/source-1.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-1.js): virtual machine for a Source §1 sublanguage (without memory management)
- [`src/virtual-machines/source-1-with-copying-gc.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-1-with-copying-gc.js): virtual machine for a Source §1 sublanguage with a Cheney-style stop-and-copy garbage collector
- [`src/virtual-machines/source-1-with-mark-region-gc.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-1-with-mark-region-gc.js): virtual machine for a Source §1 sublanguage with a Mark-Region garbage collector (2-tier granularity and overflow allocator)
- [`src/virtual-machines/register-machine-gcd.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/register-machine-gcd.js): register machine following SICP JS Section 5.2, using GCD example
- [`src/virtual-machines/source-2-with-copying-gc.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-2-with-copying-gc.js): virtual machine for a Source §2 sublanguage with a Cheney-style stop-and-copy garbage collector
- [`src/virtual-machines/source-2-with-ms-gc.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-2-with-ms-gc.js): virtual machine for a Source §2 sublanguage with a Mark-and-Sweep-style garbage collector
- [`src/virtual-machines/source-2-with-mark-region-gc.js`](https://github.com/source-academy/source-programs/blob/master/src/virtual-machines/source-2-with-mark-region-gc.js): virtual machine for a Source §1 sublanguage with a Mark-Region garbage collector (2-tier granularity and overflow allocator)

## Tool Demos

(click to run; for actual sources, go to [`src/tool-demos/`](https://github.com/source-academy/source-programs/blob/master/src/tool-demos/))

* [`src/tool-demos/stepper.js`](https://tinyurl.com/SICPJS-stepper): stepper tool (small-step semantics, based on substitution)
* [`src/tool-demos/box-and-pointer-diagrams.js`](https://tinyurl.com/SICPJS-box-and-pointer): box-and-pointer diagram visualizer for pairs and lists (following SICP JS chapter 2)
* [`src/tool-demos/environment-model.js`](https://tinyurl.com/SICPJS-env-diagram): environment model visualizer (following SICP JS chapter 3)
- [`src/tool-demos/stepper.js`](https://tinyurl.com/SICPJS-stepper): stepper tool (small-step semantics, based on substitution)
- [`src/tool-demos/box-and-pointer-diagrams.js`](https://tinyurl.com/SICPJS-box-and-pointer): box-and-pointer diagram visualizer for pairs and lists (following SICP JS chapter 2)
- [`src/tool-demos/environment-model.js`](https://tinyurl.com/SICPJS-env-diagram): environment model visualizer (following SICP JS chapter 3)

## Module Demos

(click to run; for actual sources, go to [`src/module-demos/`](https://github.com/source-academy/source-programs/blob/master/src/module-demos/))

* [`src/module-demos/runes.js`](https://tinyurl.com/SICPJS-hearts): the "picture language" of SICP JS 2.2.4
* [`src/module-demos/twist.js`](https://tinyurl.com/SICPJS-twist): some fun with the "picture language"
* [`src/module-demos/curves.js`](https://tinyurl.com/SICPJS-circle): a "curves" library for drawing curves with functional programming
* [`src/module-demos/times.js`](https://tinyurl.com/SICPJS-timestables): visual times tables using the "curves" library
* [`src/module-demos/sounds.js`](https://tinyurl.com/SICPJS-siren): a "sounds" library for generating sounds and music, starting from their constituent sine waves
* [`src/module-demos/bohemian.js`](https://tinyurl.com/SICPJS-rhapsody): Bohemian Rhapsody cover using the "sounds" library
* [`src/module-demos/pix-n-flix.js`](https://tinyurl.com/SICP-distortion): a library for image and video processing, based on the constituent pixels
- [`src/module-demos/runes.js`](https://tinyurl.com/SICPJS-hearts): the "picture language" of SICP JS 2.2.4
- [`src/module-demos/twist.js`](https://tinyurl.com/SICPJS-twist): some fun with the "picture language"
- [`src/module-demos/curves.js`](https://tinyurl.com/SICPJS-circle): a "curves" library for drawing curves with functional programming
- [`src/module-demos/times.js`](https://tinyurl.com/SICPJS-timestables): visual times tables using the "curves" library
- [`src/module-demos/sounds.js`](https://tinyurl.com/SICPJS-siren): a "sounds" library for generating sounds and music, starting from their constituent sine waves
- [`src/module-demos/bohemian.js`](https://tinyurl.com/SICPJS-rhapsody): Bohemian Rhapsody cover using the "sounds" library
- [`src/module-demos/pix-n-flix.js`](https://tinyurl.com/SICP-distortion): a library for image and video processing, based on the constituent pixels

## Test framework
* [`src/test/framework/main.js`](https://github.com/source-academy/source-programs/blob/master/src/test/framework/): test framework for Source programs, written in Source §4

- [`src/test/framework/main.js`](https://github.com/source-academy/source-programs/blob/master/src/test/framework/): test framework for Source programs, written in Source §4

# Testing

Expand All @@ -77,51 +79,50 @@ 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:

``` js
```js
parse_and_evaluate("! (1 === 1 && 2 > 3);");
// true
```

Before you can run the tests, you need to install `js-slang` by typing:

``` sh
```sh
% yarn
% yarn install
```

Run all test cases by typing:

``` sh
```sh
% yarn test
```

For 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

``` sh
```sh
Line 2073: Error: memory exhausted despite garbage collection undefined
```

can be written in the test file:

``` js
```js
// Line 2073: Error: memory exhausted despite garbage collection undefined
```

or

``` js
```js
// Error: memory exhausted despite garbage collection undefined
```

where 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 `test` script with `src/test/framework/` is pending a fix to the `--variant` parameter; any help appreciated.
> Integration of the `test` script with `src/test/framework/` is pending a fix to the `--variant` parameter; any help appreciated.

# License

[![GPL 3][gpl3-image]][gpl3]
All JavaScript programs in this repository are licensed under the
All JavaScript programs in this repository are licensed under the
[GNU General Public License Version 3][gpl3].

[gpl3]: https://www.gnu.org/licenses/gpl-3.0.en.html
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
parse_and_compile_and_run(20, 21, 3,
"\
const z = 100000000000;\
function foo(x) {\
return x + z;\
}\
foo(200000);\
list(1,2,3,4);\
");
// 'result: heap node of type = pair, value = [1,[2,[3,[4,null]]]]'
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
parse_and_compile_and_run(40, 30, 5, " \
function remove_duplicates(lst) { \
return is_null(lst) \
? null \
: accumulate((x, y) => pair(x, remove_all(x, y)), lst, lst); \
} \
remove_duplicates(list(1, 2, 1, 3, 4, 2, 1, 5)); ");
// 'result: heap node of type = pair, value = [1,[2,[3,[4,[5,null]]]]]'
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
parse_and_compile_and_run(20, 20, 10, " \
function subset(lst) { \
return is_null(lst) \
? pair(null, null) \
: append(map(l => pair(head(lst), l), subset(tail(lst))), \
subset(tail(lst))); \
} \
subset(enum_list(0, 2)); ");
// 'result: heap node of type = pair, value = [[0,[1,[2,null]]],[[0,[1,null]],[[0,[2,null]],[[0,null],[[1,[2,null]],[[1,null],[[2,null],[null,null]]]]]]]]'
9 changes: 9 additions & 0 deletions src/virtual-machines/__tests__/source-2.test19.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading