From: peng
Subject: help me understand some codes
Date:
Message-ID: <1103139382.cdc6cf1381de4d49ef101f2a697a049e@tng>
(in-package :mes)
;;; changed convention:
;;; function argument for ->* is now first instead of last argument
;;; this allows rest, optional, and keyword arguments
(defparameter *prog->*-function-second-forms*
'(funcall apply))
(defparameter *prog->-special-forms*
'(
;; (pattern . forms)
((dolist list-form &rest l ->* var)
(dolist (var list-form . l)
(unnamed-prog-> . prog->-tail)))
((dotails list-form &rest l ->* var)
(dotails (var list-form . l)
(unnamed-prog-> . prog->-tail)))
((dopairs list-form &rest l ->* var1 var2)
(dopairs (var1 var2 list-form . l)
(unnamed-prog-> . prog->-tail)))
((dotimes count-form &rest l ->* var)
(dotimes (var count-form . l)
(unnamed-prog-> . prog->-tail)))
((identity form -> var)
(let ((var form))
(unnamed-prog-> . prog->-tail)))
;; ((pttp::with-n-m-subgoals n m ->*)
;; (pttp::with-n-m-subgoals n m (unnamed-prog-> . prog->-tail)))
))
(defun prog->*-function-second-form-p (fn)
(member fn *prog->*-function-second-forms*))
(defun prog->-special-form (fn)
(assoc fn *prog->-special-forms* :key #'first))
(defun prog->-special-form-pattern (fn)
(car (prog->-special-form fn)))
(defun prog->-special-form-args (fn)
(rest (prog->-special-form-pattern fn)))
(defun prog->-special-form-result (fn)
(cdr (prog->-special-form fn)))
(defun prog->-special-form-match-error (form)
(error "~S doesn't match prog-> special form ~S."
form (prog->-special-form-pattern (first form))))
(defun prog->-no-variable-error (form)
(error "No variable to assign value to in (prog-> ... ~S ...)."
form))
(defun prog->-too-many-variables-error (form)
(error "More than one variable to assign value to in (prog-> ... ~S
...)."
form))
(defun prog->-too-many->s-error (form)
(error "More than one -> in (prog-> ... ~S ...)." form))
(defun prog->-unrecognized->-atom (atom form)
(error "Unrecognized operation ~S in (prog-> ... ~S ...)."
atom form))
(defun prog->-atom (x)
(and (symbolp x)
(>= (length (string x)) 2)
(string= x "->" :end1 2)))
(defun prog->*-function-argument (forms args)
(cond
((and (null (rest forms))
(consp (first forms))
(eq (caar forms) 'funcall)
(equal (cddar forms) args))
(cadar forms))
((and (null (rest forms))
(consp (first forms))
(not (#-(or lucid (and mcl (not openmcl))) special-operator-p
;; #-(or allegro lucid) special-form-p
;; #+allegro cltl1:special-form-p
#+(and mcl (not openmcl)) special-form-p
#+lucid lisp:special-form-p
(caar forms)))
(not (macro-function (caar forms)))
(equal (cdar forms) args))
`(function ,(caar forms)))
(t
`(function (lambda ,args ,@forms)))))
--
peng
------------------------------------------------------------------------
Posted via http://www.codecomments.com
------------------------------------------------------------------------