;;; -*- Mode: Lisp; Package: Puser; Base: 10. ; -*-

;;;; Version of LLOGO;DEFINE for the Lisp machine.

(EVAL-WHEN
 (EVAL LOAD COMPILE)

 (DEFVAR GENSYM (GENSYM))
 (DEFVAR INSIDE-OPEN-BRACKET? NIL)
  
 (DEFUN OPEN-BRACKET-MACRO NIL
	(COND ((EVAL (READ)) NIL)
	      (T (DO ((STUFF (READ) (READ))
		      (INSIDE-OPEN-BRACKET? T))
		     ((EQ STUFF GENSYM)))
		 NIL))
	NIL) 
 
 (SETSYNTAX 91. 'SPLICING 'OPEN-BRACKET-MACRO) 
 
 (DEFUN CLOSE-BRACKET-MACRO ()
	(COND (INSIDE-OPEN-BRACKET? (LIST GENSYM))
	      (NIL))) 
 
 (SETSYNTAX 93. 'SPLICING 'CLOSE-BRACKET-MACRO)) 

(DEFUN INCREMENT MACRO (CALL) 
	(RPLACA CALL 'SETQ)
	(RPLACD CALL
		(LIST (CADR CALL) (CONS (COND ((NULL (CDDR CALL)) '1+) ('+)) (CDR CALL))))) 

(DEFUN DECREMENT MACRO (CALL) 
	(RPLACA CALL 'SETQ)
	(RPLACD CALL
		(LIST (CADR CALL) (CONS (COND ((NULL (CDDR CALL)) '1-) ('-)) (CDR CALL)))))

(DEFUN BITWISE-AND MACRO (CALL) (RPLACA CALL 'BOOLE) (RPLACD CALL (CONS 1. (CDR CALL)))) 

(DEFUN BITWISE-OR MACRO (CALL) (RPLACA CALL 'BOOLE) (RPLACD CALL (CONS 7. (CDR CALL))))

(DEFUN BITWISE-NOT MACRO (CALL) 
        (RPLACA CALL 'BOOLE)
        (RPLACD CALL (CONS 6. (CONS -1. (CDR CALL)))))

(DEFUN BITWISE-XOR MACRO (CALL) (RPLACA CALL 'BOOLE) (RPLACD CALL (CONS 6. (CDR CALL))))

(DEFUN BITWISE-ANDC MACRO (CALL) (RPLACA CALL 'BOOLE) (RPLACD CALL (CONS 2. (CDR CALL))))

;;Replaced by similar thing in DLET.
;;(DEFUN ROUND MACRO (CALL) (LIST 'FIX (LIST '+$ (CADR CALL) 0.5)))

(DEFMACRO REPEAT (REPEAT-ITERATIONS . REPEAT-BODY)
	  `(DO ((REPEAT-COUNT 1. (1+ REPEAT-COUNT)))
	       ((> REPEAT-COUNT ,REPEAT-ITERATIONS))
	       . ,REPEAT-BODY))

(DEFMACRO CCONS CALL `(LIST* ,@ CALL))

(DEFMACRO DEFINE (NAME . DEFINITION)
	  (LET ((CLAUSE-NAMES '(ABB SYN)))
	       (LET ((CLAUSES (DO ((CLAUSES NIL))
				  ((NOT (AND (LISTP (CAR DEFINITION))
					     (MEMQ (CAAR DEFINITION) CLAUSE-NAMES)))
				   CLAUSES)
				  (PUSH (CAR DEFINITION) CLAUSES)
				  (POP DEFINITION))))
		    `(PROGN 'COMPILE
                            ,@ (COND ((ASSQ 'SYN CLAUSES)
				      (MAPCAR '(LAMBDA (ABB name) `(FSET ',NAME ',ABB))
					      (CDR (ASSQ 'SYN CLAUSES))
					      (circular-list name)))
                                     (`((DEFUN ,NAME ,@ DEFINITION))))
                            ,@ (COND ((ASSQ 'ABB CLAUSES)
				      (MAPCAR '(LAMBDA (ABB name) `(FSET ',ABB ',NAME))
					      (CDR (ASSQ 'ABB CLAUSES))
					      (circular-list name))))))))



