#lang scheme/base
(require scheme/runtime-path)
(provide
(all-defined-out))
(define (msleep ms)
(sync (alarm-evt
(+ (current-inexact-milliseconds)
ms))))
(define-syntax define-sr
(syntax-rules ()
((_ (name (args ...)) template)
(define-syntax name
(syntax-rules ()
((_ args ...) template))))
((_ (name . args) template)
(define-syntax name
(syntax-rules ()
((_ . args) template))))))
(define (port string/port)
(cond
((string? string/port)
(open-input-string
(string-append string/port "\n")))
((port? string/port)
string/port)
(else
(error 'invalid-type string/port))))
(define-sr (require/provide item ...)
(begin
(require item ...)
(provide (all-from-out item ...))))
(define (make-counter init)
(let ((state (- init 1)))
(lambda ()
(set! state (+ 1 state))
state)))
(define (id . vals) (apply values vals))
(define (true . args) #t)
(define (false . args) #f)
(define-syntax-rule (fail/false expr ...)
(with-handlers ((void false)) expr ...))
(define-syntax-rule (inc! val) (begin (set! val (add1 val)) val))
(define (resolve-module m)
((current-module-name-resolver) m #f #f #f))
(define-syntax-rule (*** fn arg ...)
(let ((rv (fn arg ...)))
(printf "*** ~s\n" rv)
rv))
(define next-label
(let ((next (make-counter 0)))
(lambda () (string->symbol
(format "_L~a" (next))))))
(define (definition-source id)
(let ([binding (identifier-binding id)])
(and (list? binding)
(resolved-module-path-name
(module-path-index-resolve (car binding))))))
(define (ppush! param val [error (lambda () (error 'push-pstack-undefined))])
(let ((stack (param)))
(unless stack (error))
(param (cons val stack))))
(define-syntax-rule (quote* . a) (quote a))
(define-syntax-rule (quasiquote* . a) (quasiquote a))
(define-runtime-path home-dir "..")
(define (home) (simplify-path home-dir))