Python syntax in Lisp and Scheme

Daniel P. M. Silva dsilva at ccs.neu.edu
Fri Oct 10 00:00:15 EDT 2003


Pascal Bourguignon wrote:
> "Andrew Dalke" <adalke at mindspring.com> writes:
>> > It's
>> > just a reaction to Python (a perfectly nice little scripting language)
>> > trying to morph into a language with the sophistication of Lisp.
>> 
>> Python isn't doing that.  It's lives in a perfectly good niche wherein
>> Lisp is not the most appropriate language.  At least not until there's a
>> macro which works like
>> 
>> (#python '
>> for i in range(100):
>>   print "Spam, ",
>> print
>> )
> 
> This is trivial:
> 
> (DEFUN SPLIT-ARGUMENTS (STRING)
>   (DO ((CHUNKS '()) (START 0) (POS 0))
>       ((<= (LENGTH STRING) POS)
>        (PROGN (WHEN (< START POS) (PUSH (SUBSEQ STRING START POS) CHUNKS))
>               (NREVERSE CHUNKS)))
>     (IF (CHAR= (CHAR STRING POS) (CHARACTER " "))
>       (PROGN (WHEN (< START POS) (PUSH (SUBSEQ STRING START POS) CHUNKS))
>              (INCF POS) (SETQ START POS))
>       (INCF POS)))
>   );;SPLIT-ARGUMENTS
> 
> 
> (SET-DISPATCH-MACRO-CHARACTER
>  (CHARACTER "#") (CHARACTER "!")
>  (LAMBDA (STREAM CHAR ARG)
>    (DECLARE (IGNORE CHAR ARG))
>    ;; first read the interpreter path and arguments.
>    ;; next read the script up to a line beginning with "!#".
>    ;; then generate statements to the interpreter and feed it the script.
>    (DO ((INTERPRETER (SPLIT-ARGUMENTS (READ-LINE STREAM NIL NIL T)))
>         (SCRIPT '())
>         (LINE (READ-LINE STREAM NIL NIL T)
>               (READ-LINE STREAM NIL NIL T)))
>        ((AND (<= 2 (LENGTH LINE)) (STRING= "!#" LINE :END2 2))
>         `(LET ((INTERP-INPUT (EXT:RUN-PROGRAM ,(CAR INTERPRETER)
>                                :ARGUMENTS ',(CDR INTERPRETER)
>                                :INPUT :STREAM :OUTPUT :TERMINAL)))
>            ;; Sorry, clisp specific. Please replace ext:run-program by
>            ;; your favorite hook.
>            (DOLIST (LINE ',(NREVERSE SCRIPT))
>              (FORMAT INTERP-INPUT "~A~%" LINE))
>            (CLOSE INTERP-INPUT)))
>      (PUSH LINE SCRIPT))))
> 
> 
> 
> [27]> #!/usr/bin/python
> for i in range(100):
>   print "Spam, ",
> print ""
> !#
> 
> 
> T
> [28]> Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,
> [ Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam, 
> [Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam, 
> [Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam, 
> [Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam, 
> [Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam, 
> [Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam, 
> [Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam, 
> [Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam, 
> [Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,  Spam,
> 
 
I think Andrew probably meant something more complicated, like this:

(define add-n (#python ' lambda x: x + LISP.top.n.python_value() '))

(define n 1)

(python-number->LISP-number (add-n 1)) ; 2






More information about the Python-list mailing list