jaredly/unison.rs

Scheme

70

241 commits

updated Sep 13, 2022

See the code

README

unison.rs

An experimental runtime for unison code, written in rust, compiled to wasm for use in the browser.

Usage:

  • download the release binary
  • run unison.rs serve
  • go to http://localhost:8080, view the different namespaces that you've got, click on terms to "watch" them (including the ability to provide arguments to functions, as long as they're "primitives")
  • run unison somewhere
  • grab the web example (if you want to) pull https://github.com/jaredly/unison-wasm-example .example
  • browse to example.app and click on it
  • see that it's interactive!
  • cd example and edit counter - in the scratch file, change "Hello unison" to something else
  • save the scratch file, run update in unison, and see that the watcher auto-updates in your browser!

ability abilities.a_01 where getInt : Int abilities.f_01 = handle (abilities.a_01.getInt) with cases { a } -> (a, 2) { abilities.a_01.getInt -> k } -> handle (k +5) with cases { a } -> (a, 3) abilities.t_01 = abilities.f_01 == (+5, 3)

(define stack '())

(define (throw-effect k effect) (let ((handler (car stack))) (set! stack (cdr stack)) (handler (cons 'effect (cons k effect))) ) )

(define (rethrow eff) (let ((k (cadr eff)) (ef (cddr eff))) (throw-effect k eff)))

(define (add-handler handler) (set! stack (cons handler stack)))

(define (getInt) (call/cc (lambda (k) (throw-effect k (list 'getInt)))))

(define (handle inner handler) (handler (call/cc (lambda (k) (add-handler k) ; TODO we'll have to pop at some point? (list 'pure (inner)) ))) )

(define f_01 (handle (lambda () (getInt)) (lambda (eff) (match eff [('pure a) (list a 2)] [('effect k 'getInt) (handle (lambda () (k 5)) (lambda (eff) (display eff) (match eff [('pure a) (list a 3)] [_ (rethrow eff)] ) ) ) ] [_ (rethrow eff)] ) ) ) )

Contributors

jaredly

241 commits

jaredly/unison.rs

Scheme

70

241 commits

updated Sep 13, 2022

See the code

README

unison.rs

An experimental runtime for unison code, written in rust, compiled to wasm for use in the browser.

Usage:

  • download the release binary
  • run unison.rs serve
  • go to http://localhost:8080, view the different namespaces that you've got, click on terms to "watch" them (including the ability to provide arguments to functions, as long as they're "primitives")
  • run unison somewhere
  • grab the web example (if you want to) pull https://github.com/jaredly/unison-wasm-example .example
  • browse to example.app and click on it
  • see that it's interactive!
  • cd example and edit counter - in the scratch file, change "Hello unison" to something else
  • save the scratch file, run update in unison, and see that the watcher auto-updates in your browser!

ability abilities.a_01 where getInt : Int abilities.f_01 = handle (abilities.a_01.getInt) with cases { a } -> (a, 2) { abilities.a_01.getInt -> k } -> handle (k +5) with cases { a } -> (a, 3) abilities.t_01 = abilities.f_01 == (+5, 3)

(define stack '())

(define (throw-effect k effect) (let ((handler (car stack))) (set! stack (cdr stack)) (handler (cons 'effect (cons k effect))) ) )

(define (rethrow eff) (let ((k (cadr eff)) (ef (cddr eff))) (throw-effect k eff)))

(define (add-handler handler) (set! stack (cons handler stack)))

(define (getInt) (call/cc (lambda (k) (throw-effect k (list 'getInt)))))

(define (handle inner handler) (handler (call/cc (lambda (k) (add-handler k) ; TODO we'll have to pop at some point? (list 'pure (inner)) ))) )

(define f_01 (handle (lambda () (getInt)) (lambda (eff) (match eff [('pure a) (list a 2)] [('effect k 'getInt) (handle (lambda () (k 5)) (lambda (eff) (display eff) (match eff [('pure a) (list a 3)] [_ (rethrow eff)] ) ) ) ] [_ (rethrow eff)] ) ) ) )

Contributors

jaredly

241 commits

Languages

Scheme

92.3%

Rust

5.3%

JavaScript

2.0%