From fa8e3d5b9048c9565a84ded2c6e32d93784f41c3 Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Sat, 9 Aug 2008 20:35:48 +0200 Subject: Add DEFPACKAGE, MAKE-PACKAGE, USE-PACKAGE, FIND-PACKAGE, and PACKAGEP. --- package.lisp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ string.lisp | 26 ++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 package.lisp create mode 100644 string.lisp diff --git a/package.lisp b/package.lisp new file mode 100644 index 0000000..2a17d10 --- /dev/null +++ b/package.lisp @@ -0,0 +1,80 @@ +;;; Toilet Lisp, a Common Lisp subset for the Étoilé runtime. +;;; Copyright (C) 2008 Matthias Andreas Benkard. +;;; +;;; This program is free software: you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation, either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see . + + +(in-package #:common-lisp) + +(export '(make-package defpackage use-package find-package package packagep)) + + +(defun ns-set-with-list (list) + (if list + (send-by-name (find-objc-class "NSSet") + "setWithArray:" + (send-by-name list "array")) + (send-by-name (find-objc-class "NSSet") + "set"))) + +(defun make-package (package-name &key nicknames use) + (let ((package nil)) ;FIXME: (find-package package-name) + (when package + (error "Package ˜A is already there" package-name)) + (setq package + (send-by-name (find-objc-class "MLKPackage") "packageWithName:nicknames:" + (etypecase package-name + (symbol (symbol-name package-name)) + (string package-name)) + (ns-set-with-list nicknames))) + (use-package use package) + package)) + +(defun packagep (thing) + (send-by-name thing "isKindOfClass:" (find-package "MLKPackage"))) + +(deftype package () + `(satisfies packagep)) + +(defun find-package (designator) + (etypecase designator + (package designator) + (symbol (find-package (symbol-name symbol))) + (string (send (find-objc-class "MLKPackage") + "findPackage:" + string)))) + +(defun use-package (use-list &optional package) + (unless package + (setq package *package*)) + (typecase use-list + (list (dolist (p use-list) + (send package "usePackage:" (find-package p)))) + (t (use-package (list use-list) package)))) + +(defmacro defpackage (package-name &body options) + (let ((documentation (cdr (assoc :documentation options))) + (use (cdr (assoc :use options))) + (nicknames (cdr (assoc :nicknames options))) + (shadow (cdr (assoc :shadow options))) + (shadowing-import-from (cdr (assoc :shadowing-import-from options))) + (import-from (cdr (assoc :import-from options))) + (export (cdr (assoc :export options))) + (intern (cdr (assoc :intern options))) + (size (cdr (assoc :size options))) + (name (etypecase package-name + (symbol (symbol-name package-name)) + (string package-name)))) + ;; FIXME + `(progn (make-package ',package-name :use ',use)))) diff --git a/string.lisp b/string.lisp new file mode 100644 index 0000000..f2aee0a --- /dev/null +++ b/string.lisp @@ -0,0 +1,26 @@ +;;; Toilet Lisp, a Common Lisp subset for the Étoilé runtime. +;;; Copyright (C) 2008 Matthias Andreas Benkard. +;;; +;;; This program is free software: you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation, either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see . + + +(in-package #:common-lisp) + +(export '(string stringp)) + +(deftype string () + `(satisfies stringp)) + +(defun stringp (thing) + (send thing "isKindOfClass:" (find-objc-class "NSString"))) -- cgit v1.2.3