guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to create hygienic environments?


From: Michael Tiedtke
Subject: Re: How to create hygienic environments?
Date: Sat, 20 Jun 2015 15:16:34 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0



On 20/06/2015 14:54, Neil Jerram wrote:
Michael Tiedtke <address@hidden> writes:


Just to quote myself:

The (null-environment 5) gives me an empty environment but how
should I insert the editor commands? 

Just think of these editor commands as regular Scheme definitions.
I think you're looking for 'module-define!':

scheme@(guile-user)> (define n (null-environment 5))
scheme@(guile-user)> (eval 'car n)
ERROR: In procedure memoize-variable-access!:
ERROR: Unbound variable: car

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(#{ g3900}#) [1]> ,q
scheme@(guile-user)> (eval 'car (current-module))
$2 = #<procedure car (_)>
scheme@(guile-user)> (module-define! n 'car car)
scheme@(guile-user)> (eval 'car n)
$3 = #<procedure car (_)>

Hope that helps!

    Neil


Y E S, yes yes yes yes! Exactly that! THANK YOU! Why didn't they put it in the documentation for 1.8?? Yes, finally I can force my editor users to use my stripped down editor language and not just use open on a file on the internal command line to load-file. But I could change RED (read eval display) to open port objects in editor buffers just to see it wait for a device file or socket ... well, let's see ...

;; DEFUNCT
;; nUI0c - last test case
;;
(use-modules (oop goops)
             (pretext)
             (terminal)
             (buffer)
             (buffer-view)
             (command-line-environment))

(define (switch-mode mode)
  (set! current-event-dispatcher mode))
(define (command-mode key-code)
  (case key-code
    ((#\:)    (cursor-home terminal) (display ":")
              (switch-mode command-line-mode))
    ((#\i)    (switch-mode insert-mode))
    ((#\k up)    (cursor-up       terminal))
    ((#\j down)  (cursor-down     terminal))
    ((#\l right) (cursor-forward  terminal))
    ((#\h left)  (cursor-backward terminal))))

(define command-line-buffer '())
(define key-code-enter #\newline)
(define (command-line-mode key-code)
  (display key-code)
  (case key-code
    ((#\cr)  (command-line-execute))
    ((#\esc) (set! command-line-buffer '())
             (switch-mode command-mode))
    (else
     (set! command-line-buffer
           (cons key-code command-line-buffer)))))

(define (command-line-execute)
  (define (R-E-D command-string)
    (display (eval-command-line (read-string command-string)
                                my-command-interface)))
  (define (read-string string)
    (call-with-input-string string read))
  (let ((command (list->string
                  (reverse! command-line-buffer))))
    (set! command (string-append "(" command ")"))
    (cursor-home terminal)
    (my-debug "     Command: " command " END COMMAND ")
    (cursor-home terminal)
    (catch #t
           (lambda () (R-E-D command))
           (lambda (key . args)
             (apply throw key args))
             ;; (if (eq? 'quit key)
             ;;     (throw key)
             ;;     (switch-mode command-mode)))
           (lambda (key . args)
             (if (not (eq? 'quit key))
                 (backtrace))))
    (set! command-line-buffer '())))


;;
;; Events, Jumps and other Party Functions
(define (my-command-interface what . args)
  (case what
    ((exit) (clean-exit))
    ((open) (open-file (car args)))))
(define buffer-view (make <buffer-view> #:terminal terminal))
(define (open-file path)
  (let* ((buffer (load-file path))
         (view (make <buffer-view> #:buffer buffer
                                  #:terminal terminal)))
    (set! buffer-view view)
    (refresh view)))
(define (clean-exit)
  (tty-sane-mode my-port)
  (quit))
  ;(primitive-exit))
(define current-event-dispatcher command-mode)
(define (event-dispatcher key-code)
  (current-event-dispatcher key-code))
(define (the-pre-final-handler key . args)
  (tty-sane-mode my-port)
  (backtrace))
(define (the-final-handler key . args)
  (display " Oh dear, we're gone! ")
  (for-each display args)
  (newline))

;;
;; This would have been music on Telex
(define my-port (fdopen (port->fdes (current-output-port)) "r+0b"))
(define terminal (make <terminal> #:port my-port))
(full-reset terminal)
(tty-raw-mode my-port)
(cursor-home terminal)


;;
;; Catch all or ketcHUP
(catch #t (lambda ()
            (start-event-loop terminal event-dispatcher))
       the-final-handler
       the-pre-final-handler)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]