; .EnTete "Le-Lisp (c) version 15.2" " " "Les crochets de Le←Lisp←80"
; .EnPied "croch.ll" "%" " "
; .SuperTitre "Les crochets de Le←Lisp←80"
;
; .Auteur "Je'ro↑me Chailloux"
;
; .Centre "*****************************************************************"
; .Centre " (c) Le-Lisp est une marque de'pose'e de l'INRIA "
; .Centre "*****************************************************************"
;
; .Centre "$Header: croch.ll,v 4.1 88/01/13 12:34:46 kuczynsk Rel $"
(unless (>= (version) 15.2)
(error 'load 'erricf 'croch))
; <<< \fBAttention\fR : ce macro-caracte`re est incompatible avec les
; nombres rationnels a` pre'cision variables >>>
; Une version adapte'e du macro-caracte`re crochet
; pre'sent dans Le←Lisp←80 version 12.
; [a b c d e] => (LIST A B C D E F)
; [a !b] => (CONS A B)
; [a b c !d] => (MCONS A B C D)
; [a !b !c !d] => (CONS A (APPEND B C D))
; [!a b !c] => (APPEND A (CONS B C))
; [!a !b c] => (APPEND A B (LIST C))
; .Section "Le macro-caracte`re crochet [ ] et !"
; .SSection "Les macros caracte`res eux-me↑mes"
(dmc |]| ()
(error '|]| 'errsxt "pas dans un [ ]"))
(dmc |[| ()
(flet ((|!| () '|!|)
(|]| () '|]|))
(let ((begin (list 'list)))
(readbracket begin begin (read))
begin)))
; .SSection "Lecture d'un ["
(de readbracket (begin current new)
(cond ((eq new '|]|))
((neq new '|!|)
(readbracket begin (cdr (rplacd current (list new))) (read)))
(t (let ((elemseq (list (read))))
(if (memq elemseq '(|!| |]|))
(error '|!| 'errsxt elemseq)
(if (eq begin current)
(sequence (cdr (rplac begin 'append elemseq)) (read))
(rplaca begin
(if (eq current (cdr begin)) 'cons 'mcons))
(let ((nextseq (read)))
(if (eq nextseq '|]|)
(rplacd current elemseq)
(sequence
(cdadr (rplacd current
(list (cons 'append elemseq))))
nextseq)))))))))))
(de sequence (last next)
(if (eq next '|!|)
(sequence (cdr (rplacd last (list (read)))) (read))
(when (neq next '|]|)
(let ((begin (list 'list next)))
(rplacd last (list begin))
(readbracket begin (cdr begin) (read)))))))