[Armedbear-devel] Comments on Cyrus's proposal for JSS static calls

Cyrus Harmon ch-lisp at bobobeach.com
Thu Aug 21 19:17:42 UTC 2014

On Aug 20, 2014, at 11:14 PM, Mark Evenson <evenson at panix.com> wrote:

> Erik asked me to comment on [Cyrus’s proposed patch][1] to extend JSS’s
> SHARPSIGN-DOUBLE-QUOTE use in static method calls to accept a string as well as
> a symbol to designate the object.

Thanks for taking a look.

> Unfortunately, changing JSS in the manner means that one can no longer use
> SHARPSIGN-DOUBE-QUOTE on object descended from java.lang.String, for the
> reasons described in the [JSS README][2]:
> […]
> Static calls are possible as well with the #" macro, but the
> first argument MUST BE A SYMBOL to distinguish 
>     (#"getProperties" "java.lang.System")
> from 
>     (#"getProperties" 'java.lang.System)     
> The first attempts to call a method on the java.lang.String object
> with the contents "java.lang.System", which results in an error, while
> the second invokes the static java.lang.System.getProperties() method.     
> […]

It wasn’t (isn’t) at all clear to me that in the first example we’re trying to call a method on a java.lang.String object. In fact I thought lisp strings and java strings were distinct classes (not exactly in the CLOS or java sense) of objects:

ABCL-CDK> "foo"

ABCL-CDK> (java:jnew "java.lang.String" "foo")
#<java.lang.String foo {64E135F}>

I would have thought that calling a method on a string would have failed. But, of course, I am wrong:

ABCL-CDK> (#"getBytes" (java:jnew "java.lang.String" "foo"))
#<jarray [B at 57027b0d {63DCBF1B}>

ABCL-CDK> (#"getBytes" "foo")
#<jarray [B at 3d0c15a {7E45FDAA}>

So, somewhere along the line “foo” is being treated as a java.lang.String. Hmm… Now I see your objection to my patch.

> Other than perhaps for aesthetic reasons, is there some functionality that
> using strings enables here?  To argue about preserving character case in
> strings as opposed to the case folding implicit in symbols doesn’t seem to be
> applicable, because JSS currently ignores case when searching for matching JVM
> symbols.  In 2006, when I first understood the ignoring case bit of JSS, I was
> a bit worried that there would be cases where this resulted in ambiguity and
> errors, but in the ensuing years I have yet to run into a single problem with
> this design decision.

I don’t like using naked strings as class identifiers as they’re too long to type and too error prone. So I use variables that evaluate to strings:

(defmacro jimport (java-package class &optional package)
  `(eval-when (:compile-toplevel :load-toplevel :execute)
    (defparameter ,(apply #'intern class
                          (when package (list package)))
      (concatenate 'string (symbol-name (quote ,java-package))
                   (symbol-name (quote ,class))))))

(jimport |java.util| |Vector|)

This lets me do:

(java:jnew |Vector|)

and, with my patch,

ABCL-CDK> (jimport |java.lang| |System|)
ABCL-CDK> (#"getProperties" |System|)
… which fails on a stock ABCL.

A minor convenience, I’ll admit.

> Therefore, I am not currently persuaded that introducing an asymmetry to
> SHARPSIGN-DOUBLE-QUOTE (“It works on any java Object except those which descend
> from java.lang.String; for those instances you have to use the JFI”) to use
> strings as well as symbols to specify static methods is worth it.  But please
> argue back if you disagree…

I was trying to make it work on any object that isn’t a lisp string, not realizing that lisp and java strings are more closely related than I thought.

thanks for the feedback,


> [1]: https://github.com/slyrus/abcl/commit/9ec0fb26c7b7e9470349b1c4bd9be6fa4b053177
> [2]: http://abcl.org/trac/browser/trunk/abcl/contrib/jss/README.markdown#L55
> -- 
> "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://common-lisp.net/cgi-bin/mailman/listinfo/armedbear-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/armedbear-devel/attachments/20140821/784de6ec/attachment.html>

More information about the armedbear-devel mailing list