From: tmorioka Date: Fri, 28 Feb 1997 04:56:45 +0000 (+0000) Subject: atype functions were moved from mime-play.el. X-Git-Tag: Hokutetsu-Ishikawa-new~224 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=04743b030c859edf5d4a55e3cefec2516f9a89e7;p=elisp%2Fsemi.git atype functions were moved from mime-play.el. --- diff --git a/mime-def.el b/mime-def.el index 7f94bfc..4d7a2ad 100644 --- a/mime-def.el +++ b/mime-def.el @@ -3,7 +3,7 @@ ;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko -;; Version: $Id: mime-def.el,v 0.30 1997-02-28 04:50:13 tmorioka Exp $ +;; Version: $Id: mime-def.el,v 0.31 1997-02-28 04:56:45 tmorioka Exp $ ;; Keywords: definition, MIME, multimedia, mail, news ;; This file is part of SEMI (SEMI is Emacs MIME Interfaces). @@ -251,6 +251,180 @@ FUNCTION.") pgp-function-alist) +;;; @ method selector kernel +;;; + +;;; @@ field +;;; + +(defun put-fields (tp c) + (catch 'tag + (let ((r tp) f ret) + (while r + (setq f (car r)) + (if (not (if (setq ret (assoc (car f) c)) + (equal (cdr ret)(cdr f)) + (setq c (cons f c)) + )) + (throw 'tag 'error)) + (setq r (cdr r)) + )) + c)) + + +;;; @@ field unifier +;;; + +(defun field-unifier-for-default (a b) + (let ((ret + (cond ((equal a b) a) + ((null (cdr b)) a) + ((null (cdr a)) b) + ))) + (if ret + (list nil ret nil) + ))) + +(defun field-unifier-for-mode (a b) + (let ((va (cdr a))) + (if (if (consp va) + (member (cdr b) va) + (equal va (cdr b)) + ) + (list nil b nil) + ))) + +(defun field-unify (a b) + (let ((sym (intern (concat "field-unifier-for-" (symbol-value (car a)))))) + (or (fboundp sym) + (setq sym (function field-unifier-for-default)) + ) + (funcall sym a b) + )) + + +;;; @@ type unifier +;;; + +(defun assoc-unify (class instance) + (catch 'tag + (let ((cla (copy-alist class)) + (ins (copy-alist instance)) + (r class) + cell aret ret prev rest) + (while r + (setq cell (car r)) + (setq aret (assoc (car cell) ins)) + (if aret + (if (setq ret (field-unify cell aret)) + (progn + (if (car ret) + (setq prev (put-alist (car (car ret)) + (cdr (car ret)) + prev)) + ) + (if (nth 2 ret) + (setq rest (put-alist (car (nth 2 ret)) + (cdr (nth 2 ret)) + rest)) + ) + (setq cla (put-alist (car cell)(cdr (nth 1 ret)) cla)) + (setq ins (del-alist (car cell) ins)) + ) + (throw 'tag nil) + )) + (setq r (cdr r)) + ) + (setq r (copy-alist ins)) + (while r + (setq cell (car r)) + (setq aret (assoc (car cell) cla)) + (if aret + (if (setq ret (field-unify cell aret)) + (progn + (if (car ret) + (setq prev (put-alist (car (car ret)) + (cdr (car ret)) + prev)) + ) + (if (nth 2 ret) + (setq rest (put-alist (car (nth 2 ret)) + (cdr (nth 2 ret)) + rest)) + ) + (setq cla (del-alist (car cell) cla)) + (setq ins (put-alist (car cell)(cdr (nth 1 ret)) ins)) + ) + (throw 'tag nil) + )) + (setq r (cdr r)) + ) + (list prev (append cla ins) rest) + ))) + +(defun get-unified-alist (db al) + (let ((r db) ret) + (catch 'tag + (while r + (if (setq ret (nth 1 (assoc-unify (car r) al))) + (throw 'tag ret) + ) + (setq r (cdr r)) + )))) + +(defun delete-atype (atl al) + (let* ((r atl) ret oal) + (setq oal + (catch 'tag + (while r + (if (setq ret (nth 1 (assoc-unify (car r) al))) + (throw 'tag (car r)) + ) + (setq r (cdr r)) + ))) + (delete oal atl) + )) + +(defun remove-atype (sym al) + (and (boundp sym) + (set sym (delete-atype (eval sym) al)) + )) + +(defun replace-atype (atl old-al new-al) + (let* ((r atl) ret oal) + (if (catch 'tag + (while r + (if (setq ret (nth 1 (assoc-unify (car r) old-al))) + (throw 'tag (rplaca r new-al)) + ) + (setq r (cdr r)) + )) + atl))) + +(defun set-atype (sym al &rest options) + (if (null (boundp sym)) + (set sym al) + (let* ((replacement (memq 'replacement options)) + (ignore-fields (car (cdr (memq 'ignore options)))) + (remove (or (car (cdr (memq 'remove options))) + (let ((ral (copy-alist al))) + (mapcar (function + (lambda (type) + (setq ral (del-alist type ral)) + )) + ignore-fields) + ral))) + ) + (set sym + (or (if replacement + (replace-atype (eval sym) remove al) + ) + (cons al + (delete-atype (eval sym) remove) + ) + ))))) + + ;;; @ rot13-47 ;;; ;; caesar-region written by phr@prep.ai.mit.edu Nov 86