anchor.diff:  	(append normal-args (alexandria:flatten key-args) rest-arg)))))
     
   
  +;;;;
  +;;;; Returns the type specifications in a documented-lambda list.
  +;;;; This is returned for all the arguments.
  +(defun %documented-lambda-list-argument-types (doc-lambda-list &key (error-on-missing-doc t))
  +  (let ((norm-args
  +	  (%normalize-parsed-documented-lambda-list
  +	   (%parse-documented-lambda-list
  +	    doc-lambda-list
  +	    :error-on-missing-doc error-on-missing-doc))))
  +    (mapcar #'(lambda (norm-arg)
  +		(if (eq :positional (getf norm-arg :type))
  +		    (if (listp (car (getf norm-arg :lambda-list-foward)))
  +			(elt (car (getf norm-arg :lambda-list-foward)) 1)
  +			't)
  +		    't))
  +	    (remove-if #'(lambda (norm-arg)
  +			   (eq :other (getf norm-arg :type)))
  +		       norm-args))))
  +;;;;
  +;;;; Creates a symbol based on a concept and the typed arguments given 
  +;;;; to it
  +(defun %create-concept-symbol (concept-name arg-types &optional (package *concepts-package*) )
  +  (let ((s 
  +	  (intern (apply #'concatenate 
  +			 'string 
  +			 (symbol-name concept-name)
  +			 (mapcar #'(lambda (type)
  +				     (concatenate 'string
  +						  "["
  +						  (symbol-name type)
  +						  "]"))
  +				 arg-types))
  +		  package)))
  +    (setf (symbol-value s) +UNSET-IMPLEMENTATION-TAG+)
  +    s))
  +		       
  +		       
  +
   	
   ;;;; 
   ;;;; A special symbol meaning that a concept has an unset implementation tag
  
positive.code: ;;;; (or the given concepts package, defautls ot current)
  (defmacro define-concept (concept-name concept-args doc &key (package *concepts-package*) (error-when-duplicate-concept t))
    (let ((concept-method (intern (concatenate 'string (symbol-name concept-name) "")))
  	(concept-method-impl (intern (concatenate 'string (symbol-name concept-name) "-IMPL"))))
      (with-concepts-package package
        (if (and (find-symbol (symbol-name concept-name) *concepts-package*)
  	       error-when-duplicate-concept)
  
negative.code: ;;;; if not already there (with + around it)
  (defmacro implement-concept ( (concept-name implementation-tag doc &key (default-implementation nil)) documented-lambda-list &body body )
    (let ((method-name (intern (concatenate 'string (symbol-name concept-name) "-IMPL")))
  	(normal-lambda-args (%documented-lambda-list-to-lambda-list documented-lambda-list :error-on-missing-doc nil))
  	(concept-symbol (%create-concept-symbol concept-name 
  						(%documented-lambda-list-argument-types documented-lambda-list :error-on-missing-doc nil))))
      (let* ((implementation-tag-+ (concatenate 'string "+" (symbol-name implementation-tag) "+"))
  	   (implementation-tag-symbol 
  	    (find-or-make-implementation-tag implementation-tag-+ (symbol-name concept-name) doc))
  	   (concept-check (list (gensym "concept-var-") `(eql ',implementation-tag-symbol))))
        (when (and 
  	     (eq (symbol-value concept-symbol)
  		 +UNSET-IMPLEMENTATION-TAG+)
  	     default-implementation)
  	(setf (symbol-value concept-symbol)
  	      implementation-tag-symbol))
        `(progn
  	   
  	 (define-concept-method-impl ,method-name (,concept-check ,@normal-lambda-args) ,@body)))))
  
  
  ;;;;
  