is there any option I can pass to gsi so that the following code will work?
(pp '(\ 1 2 3)) *** ERROR IN (console)@1.11 -- Invalid infix syntax 3 *** ERROR IN (console)@1.14 -- Datum or EOF expected *** ERROR IN (console)@1.15 -- Datum or EOF expected
thanks! -- -- symbolic expression
Afficher les réponses par date
On 25-Jan-09, at 5:31 PM, symbolic expression wrote:
is there any option I can pass to gsi so that the following code will work?
(pp '(\ 1 2 3)) *** ERROR IN (console)@1.11 -- Invalid infix syntax 3 *** ERROR IN (console)@1.14 -- Datum or EOF expected *** ERROR IN (console)@1.15 -- Datum or EOF expected
thanks!
The behavior of read and write (i.e. the mapping from the external representation to the internal object representation) is controlled with a "readtable" which is a structure storing various settings. By default the main readtable (i.e. ##main-readtable) supports a number of Scheme extensions, and in particular the SIX syntax (Scheme Infix eXtension). The SIX syntax is explained here: http://www.iro.umontreal.ca/~gambit/doc/gambit-c.html#SEC126 Basically the backslash character announces a switch from the usual prefix syntax to the infix syntax (which is very much like the C syntax). This behavior can be changed by setting a new handler for the backslash character in the main readtable. Below is an example. Note that the readtable also affects the way in which objects are written. ;; Change the way the backslash character is handled by read and write. (##readtable-char-class-set! ##main-readtable ;; change the main readtable #\\ ;; char to dispatch on #f ;; *NOT* a delimiter ##read-number/keyword/symbol) ;; handler (normally set to ##read-six) (define x (read (open-input-string "(\\ 1 2 3)"))) (write x) ;; will write: (\ 1 2 3) (newline) ;; Set the readtable back to the default behavior. (##readtable-char-class-set! ##main-readtable #\\ #t ##read-six) (write x) ;; will write: (|\\| 1 2 3) (newline) (define y (read (open-input-string "(\\ 1 ; 2 3)"))) (write y) ;; will write: ((six.literal 1) 2 3) (newline) You can put the call to ##readtable-char-class-set! in various places. If you want all your invocations of gsi and gsc to behave this way, then put the call in ~/.gambcini.scm . Then you can do things like: (define-macro (\ . rest) `(lambda ,@rest)) (pp (map (\ (x) (* x x)) '(1 2 3))) ;; prints: (1 4 9) Of course it might be cuter to use the Unicode lambda like this: (define-macro (λ . rest) `(lambda ,@rest)) (pp (map (λ (x) (* x x)) '(1 2 3))) ;; prints: (1 4 9) and select an appropriate Unicode character encoding for file I/O, such as UTF-8: % gsi -:f8 test.scm Marc
participants (2)
-
Marc Feeley -
symbolic expression