parenscript does not redefine "defun", it imports cl:defun and exports it again.
CL-USER> (eq 'ps:defun 'cl:defun ) T
Exporting has nothing to do with the package lock. it refers to when you try to redefine cl:defun.
You can define your own defun in your own package. The library *Series *does this but it does not export it.
from s-package.lisp
(defpackage #:series (:use #:cl) (:export ... )
(:shadow #:let #:let* #:multiple-value-bind #:funcall #:defun #+(or cmu scl) #:collect #+(or cmu scl) #:iterate) .... )
from s-code.lisp:
;; EXTENSION (defmacro defun (name lambda-list &environment *env* &body body) (if (dolist (form body) (cond ((and (stringp form) (eq form (car body)))) ((and (consp form) (eq-car form 'declare)) (if (assoc 'optimizable-series-function (cdr form)) (return t))) (t (return nil)))) (define-optimizable-series-fn name lambda-list body) (progn (undefine-optimizable-series-fn name) `(cl:defun ,name ,lambda-list . ,body))))
you could export it, put it would generate conflicts when you use it.
SERIES> (export 'defun) T SERIES> (in-package :cl-user) #<PACKAGE "COMMON-LISP-USER"> CL-USER> (use-package :series) USE-PACKAGE #<PACKAGE "SERIES"> causes name-conflicts in #<PACKAGE "COMMON-LISP-USER"> between the following symbols: SERIES:DEFUN, COMMON-LISP:DEFUN [Condition of type NAME-CONFLICT] See also: Common Lisp Hyperspec, 11.1.1.2.5 [:section] ; Evaluation aborted on #<NAME-CONFLICT {1002576393}>. CL-USER>
I hope this clarifies it for you.
andy peterson
On Sun, 9 Jun 2019 at 15:39, James Gunn jgunn987@gmail.com wrote:
Hello,
I have been reading the source code for parenscript and I am keen to find out how you override locked symbols? In the parenscript package there are exports such as "#:defun". I have tried myself to create my own package that exports defun but i get the following error message(using SBCL)
"Lock on package COMMON-LISP violated when proclaiming DEFUN as a function"
I'd be very interested in finding out how you got around this.
Thank you,
James Gunn