;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Common Lisp (弱)互換パッケージ ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 算術関数 (defun 1- (x) (- x 1)) (defun 1+ (x) (+ x 1)) (defmacro inc (x) `(setq ,x (+ ,x 1))) (defmacro dec (x) `(setq ,x (- ,x 1))) ;;; リスト (defun second (list) (car (cdr list))) (defun third (list) (car (cdr (cdr list)))) (defmacro pop (list) `(let ((ret (car ,list))) (setq ,list (cdr ,list)) ret)) (defmacro push (element list) `(setq ,list (cons ,element ,list))) ;;; 繰り返し (defmacro dotimes (vars &rest forms) `(for ((,(car vars) 0 (1+ ,(car vars)))) ((>= ,(car vars) ,(second vars)) nil) . ,forms)) (defmacro dolist (lists &rest forms) `(let ((list ,(second lists)) (,(car lists) nil) ) (while list (setq ,(car lists) (car list)) ,@forms (setq list (cdr list)) ))) ;;; 入出力 (defun print (arg &rest opt) (let ((stream (standard-output))) (if opt (setq stream (car opt))) (format stream "~S~%" arg) )) (defun prin1 (arg &rest opt) (let ((stream (standard-output))) (if opt (setq stream (car opt))) (format stream "~S" arg) )) (defun terpri (&rest opt) (let ((stream (standard-output))) (if opt (setq stream (car opt))) (format stream "~%") )) (defun read-from-string (string) (let ((stream nil) (ret nil) ) (catch 'read-from-string-error (with-handler (lambda (condition) (close stream) (throw 'read-from-string-error nil)) (setq stream (create-string-input-stream string)) (setq ret (read stream)) (close stream) ret ))))