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