;;; -*- Mode:LISP; Package:(MAKE USE LISP); Base:10; Readtable:CL -*- (defstruct (file-info :named) pathname plist) (defstruct (sysdef :named) name modules plist ) ; (define-system foo ; (:pathname-default "sys:foo;") ; (:module defs ("d1" "d2")) ; (:module main ("m1" "m2")) ; (:module top ("t1" "t1"))) (define-system foo (:pathname-default "sys:foo;") (:module defs ("d1" "d2")) (:module main ("m1" "m2")) (:module top ("t1" "t1"))) (defmacro define-system (name &rest args) (let ((pathname-default (or (cadr (assoc :pathname-default args)) *default-pathname-defaults*))) `(setf (getf (symbol-plist ',name) ' `(make-sysdef :name ',name :modules ,(let ((modules '())) (dolist (clause args) (when (eq (car clause) :module) (push (mapcar #'(lambda (name) (make-file-info :pathname (merge-pathnames name pathname-default) :plist nil)) (caddr clause)) modules))) (reverse modules)) :plist nil)))