Put all files into a directory named shen-thing
.
Run
$ cd shen-thing
$ raco pkg install
To test, run racket test.rkt
. You should see:
(my-list '(2 3 4))
(my-list '(2 3 4))
as the output
#lang racket/base | |
(provide configure) | |
(require "reader.rkt") | |
(define (configure data) | |
(current-read-interaction read-syntax)) |
#lang racket/base | |
(define (get-info data) | |
(λ (key default) | |
(case key | |
[(configure-runtime) | |
'(#(shen-thing/configure-runtime configure #f))] | |
[else | |
default]))) | |
(provide get-info) |
#lang racket | |
(module reader syntax/module-reader | |
shen-thing | |
#:read read | |
#:read-syntax read-syntax | |
#:language-info '#(shen-thing/lang-info get-info #f) | |
(require "reader.rkt")) | |
(provide (all-from-out racket)) | |
;; NOTE: need this to get namespace thing correct. | |
(require "runtime.rkt") |
#lang racket | |
(provide (rename-out [-read read] | |
[-read-syntax read-syntax])) | |
(require hygienic-reader-extension/extend-reader | |
"runtime.rkt") | |
;; wrap-reader : (-> (-> A ... Any) (-> A ... Any)) | |
(define (wrap-reader reader-proc) | |
(extend-reader reader-proc extend-readtable)) | |
;; add-quote : (-> Syntax Syntax) | |
(define (add-quote stx) | |
(datum->syntax #f (cons #'make-my-list | |
(syntax->list stx)) | |
stx | |
stx)) | |
;; extend-readtable : (-> Readtable #:outer-scope (-> Syntax Syntax) Readtable) | |
(define (extend-readtable rt #:outer-scope outer-scope) | |
(make-readtable rt | |
#\[ 'terminating-macro (bracket-proc outer-scope rt))) | |
;; bracket-proc : (-> (-> Syntax Syntax) Readtable-Proc) | |
(define ((bracket-proc outer-scope rt) c in src ln col pos) | |
(hygienic-app add-quote (read-syntax/recursive src in c rt) | |
#:outer-scope outer-scope)) | |
(define -read (wrap-reader read)) | |
(define -read-syntax (wrap-reader read-syntax)) |
#lang racket | |
(provide (struct-out my-list) | |
make-my-list) | |
(struct my-list (content) #:transparent) | |
(define (make-my-list . xs) | |
(my-list xs)) |
#lang shen-thing | |
[(+ 1 1) 3 4] | |
(let ((my-list values) | |
(make-my-list values)) | |
[(+ 1 1) 3 4]) |