Mercurial > hg > jslab
view src/scheme/shell.scm @ 8:5e3cbbf173aa tip
Reorganise some more
author | samer |
---|---|
date | Fri, 05 Apr 2019 22:41:58 +0100 |
parents | bf79fb79ee13 |
children |
line wrap: on
line source
(import "samer.core.*") (import "samer.core.types.*") (import "samer.silk.*") (define true #t) (define false #f) (define (for-it proc it) (if (.hasNext it) (begin (proc (.next it)) (for-it proc it)))) ;;; directory handling (define (abs-path path) (.getCanonicalPath (java.io.File. path))) (define (pwd) (abs-path ".")) ;(define .. "..") (define (cd dir) (System.setProperty "user.dir" (abs-path dir)) (System.getProperty "user.dir")) (define (ls . paths) (array->list (.listFiles (java.io.File. (if (null? paths) "." (first paths)) )))) (define (filter p? l) (reverse (filter-rev p? l ()))) (define (filter-rev p? l a) (if (null? l) a (let ((h (car l)) (t (cdr l))) (if (p? h) (filter-rev p? t (cons h a)) (filter-rev p? t a))))) ;(define push Shell.push) ;(define pop Shell.pop) (define env Shell.env) (define cat string-append) (define (pr-env) (for-it (lambda (b) (display (.name b)) (display "=") (write (.get b X.ObjectCodec$ null)) (display "\n")) (.data (Shell.env)))) (define (vbls) (.getViewables (get "ViewableManager"))) (define (pr-vbls) (for-it (lambda (v) (display (.toString (.getNode v))) (newline)) (vbls))) (define (it->list it) (define (accum it list) (if (not (.hasNext it)) list (accum it (cons (.next it) list)))) (reverse (accum it ()))) (define (view-vector L name) (Shell.expose (javax.swing.JScrollPane. (javax.swing.JList. L)) name) null) (define (view-list L name) (view-vector (list->vector L) name)) (define (print l) (define (print-list l n) (if (null? l) (newline) (begin (display (cat (number->string n) ": " (first l))) (newline) (print-list (rest l) (+ n 1))))) (if (list? l) (print-list l 0) (if (vector? l) (print (vector->list l)) (begin (display l) (newline)) ) ) ) ;;; ------------ some macros ------------ (define node (macro (name . body) `(begin (Shell.push ,name) (let ((a (tryCatch (begin . ,body) (lambda (ex) (Shell.pop) (throw ex))))) (Shell.pop) a)))) ; ; (define node (macro (name . body) ; ; `(let* ( (a (Shell.push ,name)) ; ; (b (begin . ,body)) ) ; ; (Shell.pop) b ; ; )) ; ; ) ;;; this creates a named node as a child of (.getNode parent) (define (child parent name) (Node. name (.getNode parent))) ;;; alternative version ;(define node (macro (name . body) ; `(Shell.push ,name) ; `(let ((b (begin . ,body))) ; (Shell.pop) b) ;)) (define observer (macro body `(samer.silk.SilkObserver. (lambda (o a) ,@body)))) (define on-change (macro (o . body) `(.addObserver ,o (samer.silk.SilkObserver. (lambda (o a) ,@body))) )) ;;; --------------------------------------- (define-method (exec (agent Agent) cmd) (.execute agent cmd (Shell.env))) (define-method (exec (vbl Viewable) cmd) (.execute (.getAgent vbl) cmd (Shell.env))) (define-method (exec (mat samer.maths.Matrix) cmd) (.execute (.getAgent mat) cmd (Shell.env))) (define (matexec matrix cmd) (exec (samer.maths.MatrixAgent. matrix) cmd)) (define (viewable name) (.getViewable (get "ViewableManager") (.abs (Shell.env) name))) (define (edit-vbl vbl) (Shell.showDialogFor (.getComponent (.getViewer vbl)) (.getLabel vbl))) (define (cur-node) (.node (env))) (define (set nm vl) (X.store nm vl)) (define (put nm vl) (Shell.put nm vl)) (define (get nm) (Shell.get nm)) (define (pr-viewables) (.listViewables (get "ViewableManager"))) (define (exit) (.dispatch (get "AgentManager") "exit" (Shell.env))) (define-method (expose) (.dispatch (get "AgentManager") "expose" (Shell.env))) (define-method (expose (name String)) (Shell.expose (viewable name))) (define-method (expose (vbl Viewable)) (Shell.expose (.getViewer vbl) (.fullName (.getNode vbl)))) (define-method (expose (vwr Viewer) (name String)) (Shell.expose vwr name)) ; another kind of store ;(define (store nm obj) (.store (Shell.env) nm obj X.StringCodec$)) (define (hclicker canvas_name rcname) (define rc (viewable rcname)) (define cl (Clicker. (get canvas_name) (+ (.getMax rc) 1) 1)) (.setXReceiver cl rc)) (define (vclicker canvas_name rcname) (define rc (viewable rcname)) (define cl (Clicker. (get canvas_name) 1 (+ (.getMax rc) 1))) (.setYReceiver cl rc))