[armedbear-devel] MAKE-IMMEDIATE-OBJECT and JOBJECT-LISP-VALUE conceptual problem

Alan Ruttenberg alanruttenberg at gmail.com
Sat Jun 11 07:06:35 UTC 2011


I've always disliked make-immediate-object. Really it serves the
purpose of disambiguating a few overloaded values in lisp. I'd like to
deprecate it in favor of specific constants for java-true, java-false
and null-pointer (the latter is already available as function).

It seems dangerous to assume that one can get some java array as the
underlying object below a lisp array, what with all the hair that lisp
arrays can have.  Better to allocate your buffer with (jnew-array
"byte" 8192) and not get into this game. Or have a documented policy
of how java objects correspond to lisp objects and promise to support
it forever.

2c,
-Alan


On Fri, Jun 10, 2011 at 11:42 AM, Mark Evenson <evenson at panix.com> wrote:
> Today, I spent a bit of time trying to figure out a way to efficiently
> compute message digest for Quicklisp.  After confirming that
> java.security.MessageDigest implements the required digests, I noticed we
> didn't have a way to easily get at the underlying Java byte[] array in
> (SIMPLE-VECTOR (UNSIGNED-BYTE 8)).  So, I patched the underlying Java code
> as attached, and wrote the following routine:
>
> (defun sha-256 (path)
>  (let ((buffer (make-array 8192 :element-type '(unsigned-byte 8))
>          (digest (jstatic "getInstance" "java.security.MessageDigest"
> "SHA-256")))
>        (with-open-file (in path :element-type '(unsigned-byte 8))
>          (loop :for bytes = (read-sequence buffer in)
>             :while (plusp bytes)
>             :do (jcall-raw "update" digest (make-immediate-object buffer) 0
> bytes))
>          (jcall "digest" digest)))))
>
> But then I noticed that MAKE-IMMEDIATE-OBJECT calls JOBJECT-LISP-VALUE which
> makes no conceptual sense.  The doc for MAKE-IMMEDIATE-OBJECT reads
> "[a]ttempts to coerce a given Lisp object into a java-object" while the doc
> JOBJECT-LISP-VALUE reads "Attempts to coerce JAVA-OBJECT into a Lisp
> object".   This seems wrong here, but I don't understand how exactly.  I
> think we need to distinguish three types of values here: JAVA-OBJECT,
> LispObject, and the "raw" value of the Java.  How should we really structure
> our Java FFI here?
>
> With my patch, for an underlying lisp value of type (SIMPLE-VECTOR
> (UNSIGNED-BYTE 8)), both MAKE-IMMEDIATE-OBJECT and JOBJECT-LISP-OBJECT
> return the byte[] array.  I would think that MAKE-IMMEDIATE-OBJECT should
> just do this, which JOBJECT-LISP-OBJECT should .... return an error if its
> argument isn't of type JAVA-OBJECT?  I don't know.  I am confused.
>
> Can someone help me understand the right way forward here?
>
> --
> "A screaming comes across the sky.  It has happened before, but there
> is nothing to compare to it now."
>
> _______________________________________________
> armedbear-devel mailing list
> armedbear-devel at common-lisp.net
> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/armedbear-devel
>
>




More information about the armedbear-devel mailing list