#132: Inconsistent use of :case :common for pathnames
-------------------------+--------------------------------------------------
Reporter: mevenson | Owner: ehuelsmann
Type: defect | Status: new
Priority: major | Milestone: 0.25
Component: interpreter | Version: 0.24
Keywords: |
-------------------------+--------------------------------------------------
Pascal Bourguignon notes:
{{{
CLHS says:
19.2.2.1.2.2 Common Case in Pathname Components
For the functions in Figure 19-2, a value of :common for the :case
argument that these functions should receive and yield strings in
component values according to the following conventions:
* All uppercase means to use a file system's customary case.
* All lowercase means to use the opposite of the customary case.
* Mixed case represents itself.
Note that these conventions have been chosen in such a way that
translation from :local to :common and back to :local is
information-preserving.
[pjb@kuiper :0.0 lisp]$ abcl
Armed Bear Common Lisp 0.20.0
Java 1.6.0_22 Sun Microsystems Inc.
Java HotSpot(TM) Server VM
Low-level initialization completed in 0.265 seconds.
Startup completed in 0.718 seconds.
Type ":help" for a list of available commands.
CL-USER(1): (make-pathname :name "TEST" :type "LISP" :case :common)
#P"TEST.LISP"
CL-USER(2): (namestring (make-pathname :name "TEST" :type "LISP" :case
:common))
"TEST.LISP"
I'm on a linux system on a ext3 file system. The customary case is
lower case (case significant on this particular file system, but
99.999% of the files on unix are lower case).
Therefore I would expect to get #P"test.lisp"
Notice that:
(make-pathname :name "test" :type "lisp" :case :common)
should produce #P"TEST.LISP"
and that:
(make-pathname :name "Test" :type "Lisp" :case :common)
should produce #P"Test.Lisp"
}}}
{{{
Mark Evenson writes:
> > On 11/7/10 5:02 AM, Pascal J. Bourguignon wrote:
>> >>
>> >> CLHS says:
>> >>
>> >> 19.2.2.1.2.2 Common Case in Pathname Components
>> >>
>> >> For the functions in Figure 19-2, a value of :common for the
:case
>> >> argument that these functions should receive and yield strings
in
>> >> component values according to the following conventions:
>> >>
>> >> * All uppercase means to use a file system's customary case.
>> >> * All lowercase means to use the opposite of the customary
case.
>> >> * Mixed case represents itself.
>> >>
>> >> Note that these conventions have been chosen in such a way that
>> >> translation from :local to :common and back to :local is
>> >> information-preserving.
> >
> > What an odd corner of the CLHS, littered with the bones of extinct
> > filesystems! This behavior that seems like it would produce
> > unpleasantries much more than it would help anyone, violating the
> > principle of least surprise. But we claim that ABCL will be ANSI
first
> > and foremost, so I guess we have to pay attention here…
I should mention that I use routinely logical pathnames, and they work
very well, on all implementations that conformantly implement them.
That means that all my logical pathnames are always upcase letters, and
no special symbols (apart from an occasional dash).
I understand that using implementation dependant syntax (special
characters, lower-case, mixed-case) in logical pathnames can lead to
surprises, but I avoid them.
Now, it's not a question of extinct file systems. You still have to
deal with at least two different major syntaxes: POSIX and
MS-Windows/MS-DOS.
I just cannot use in programs that will have to run on both Linux or
MacOSX and MS-Windows physical pathname literals, because they don't use
the same syntax.
On the other hand, #P"HOME:SRC;LISP;EXAMPLE.LISP"
can be translated to either
#P"C:\\Users Files\\Pascal\\src\\lisp\\example.lisp" or
#P"/home/pjb/src/lisp/example.lisp"
portably on these targets.
The point for an implementation is to know what it's targets are, and to
implement proper behavior when translating and merging logical
pathnames. You must be careful when merging logical pathnames with
physical pathnames, notably when it's done in make-pathname: the :case
parameter must have effect only on the new strings, not on the :defaults
parameter.
> > I suppose there is no definition of "customary case", huh?
Indeed.
> > Pascal suggests a notion of filesystem statistics ("99.999% of files
> > are lowercase") but for a developer dealing with lots of Java files
> > this isn't very releavant.
Does Java provide its own file system, or does it map to the host file
system?
Notice that logical pathnames don't have to be able to represent all the
physical pathnames, without an explicit translation.
If you have a file system that is case sensitive, then you may write:
(setf (logical-pathname-translations "APP")
(list
(list #P"APP:EXAMPLE;FILE.LISP"
#P"/MyApp/Example/File.lisp")
(list #P"APP:EXAMPLE;ANOTHER-FILE.LISP"
#P"/MyApp/Example/AnotherFile.lisp")
(list #P"APP:EXAMPLE;*.DATA"
#P"/MyApp/Example/*.appdata")
(list #P"APP:EXAMPLE;SOME-MODULE.*"
#P"/MyApp/Example/SomeBigModule.*")
(list #P"APP:APP.CONFIGURATION" #P"/MyApp/.config")
(list #P"APP:CUSTOMARY;**;*" #P"/MyApp;**;*")
(list #P"APP:CUSTOMARY;**;*.*" #P"/MyApp;**;*.*")))
to be able to access to files with strange physical names.
The question indeed is to decide what is the customary case. You can
choose uppercase or you can choose lowercase. This matters only for
file systems that are case sensitive, but even file systems that are not
case sensitive, such as MS-DOS, have a prefered way to display the
names.
> > Lacking a more precise definition, I would then advocate that we
declare
> > lowercase to be the customary case across UNIX, OSX, and Windows for
> > ABCL, patching our behavior accordingly.
That would be good.
> > I thought briefly about advocating Windows to have "uppercase" as its
> > customary case, but that is only really true in a DOS world which
> > "modern" Windows systems really aren't any more.
Yes.
> > And although we theoretically run on JVMs on say VMS, if we run into
> > such needs, we might devote a user-accessible special variable to
> > control the implementation.
This is also a good option.
}}}
--
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/132>
armedbear <http://common-lisp.net/project/armedbear>
armedbear
#248: More clear error handling for toString throwing an exception
--------------------------------------------+-------------------------------
Reporter: https://openid.fau.de/eg74yneg | Owner: ehuelsmann
Type: enhancement | Status: new
Priority: major | Milestone:
Component: interpreter | Version:
Keywords: |
--------------------------------------------+-------------------------------
For some class *test* imported from Java
{{{
PKG> (#"toString" *test*)
; Evaluation aborted on #<JAVA-EXCEPTION java.lang.NullPointerException
{FD82F5}>.
PKG> *test*
; Evaluation aborted on NIL.
}}}
so the second form could include some indication on what goes wrong
especially as toString is called fairly regular in a interactive LISP
session
--
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/248>
armedbear <http://common-lisp.net/project/armedbear>
armedbear
#197: JAR-PATHNAME errors and ambiguities
--------------------------+-------------------------------------------------
Reporter: mevenson | Owner: ehuelsmann
Type: defect | Status: new
Priority: major | Milestone: 1.1.0
Component: interpreter | Version: 1.0.1
Keywords: jar-pathname |
--------------------------+-------------------------------------------------
[http://article.gmane.org/gmane.lisp.armedbear.devel/2200 Yong reports on
armedbear@devel]:
{{{
CL-USER> (make-pathname :device '("c:/a.b.jar")
:directory '(:absolute "cl-ppcre"))
; Evaluation aborted on NIL.
}}}
Why am I not getting any errors (and not dropping into a debugger)? I
know the error is because the device is not a list of a pathname ie
missing a #P.
2. What's printed out is not what was read in (trailing /)
{{{
CL-USER> #P"jar:file:c:/a/b.jar!/cl-ppcre/"
#P"jar:file:c:/a/b.jar!/cl-ppcre"
}}}
3. Should this repeated jar:file:jar:file thing throw an error?
{{{
#P"jar:file:jar:file:c:/a/b.jar!/cl-ppcre/"
==> #P"jar:file:jar:file:c:/a/b.jar!/cl-ppcre"
}}}
--
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/197>
armedbear <http://common-lisp.net/project/armedbear>
armedbear
#233: Evaluation of (DIRECTORY "/*/") fails
------------------------+---------------------------------------------------
Reporter: ehuelsmann | Owner: mevenson
Type: defect | Status: new
Priority: major | Milestone:
Component: libraries | Version: 1.1.0-dev
Keywords: |
------------------------+---------------------------------------------------
Reported by Stas Boukarev on #abcl:
(DIRECTORY "/*/")
--->
#<THREAD "interpreter" {E2B9E5}>: Debugger invoked on condition of type
TYPE-ERR
OR
The value NIL is not of type (OR PATHNAME STRING FILE-STREAM SYSTEM:JAR-
STREAM
SYSTEM:URL-STREAM).
Restarts:
0: TOP-LEVEL Return to top level.
--
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/233>
armedbear <http://common-lisp.net/project/armedbear>
armedbear
#239: defgeneric with unsuitable :generic-function-class gives incomprehensible
error
-----------------------+----------------------------------------------------
Reporter: rschlatte | Owner: ehuelsmann
Type: defect | Status: new
Priority: minor | Milestone:
Component: (A)MOP | Version:
Keywords: |
-----------------------+----------------------------------------------------
Compiling and loading the following (incorrect) file gives an error saying
that foo-generic-function is not of type standard-generic-function. The
real error is that foo-generic-function must be defined with (:metaclass
funcallable-standard-class) to be suitable as a generic function class.
{{{
(require :clos)
(defclass foo-generic-function (standard-generic-function))
(defgeneric goo (a b)
(:generic-function-class foo-generic-function)
(:method (a b)
(princ "default method")))
(print #'goo)
}}}
The attached patch would emit a full warning in defgeneric, but currently
find-class does not implement correct behavior when called with 3
parameters.
--
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/239>
armedbear <http://common-lisp.net/project/armedbear>
armedbear
#242: Unused &key warnings in defmethod forms should not cause style-warnings
-----------------------+----------------------------------------------------
Reporter: rschlatte | Owner: ehuelsmann
Type: defect | Status: new
Priority: minor | Milestone:
Component: compiler | Version:
Keywords: |
-----------------------+----------------------------------------------------
CLHS 7.6.5 says: "The lambda list congruence rules require that each
method accept all of the keyword arguments mentioned after &key in the
generic function definition, by accepting them explicitly, by specifying
&allow-other-keys, or by specifying &rest but not &key."
Currently, when compiling a file containing the form
{{{(defmethod foo ((x fixnum) &key y z) x)}}}
we get style warnings about unused variables y and z. I think that these
style warnings can be safely elided, since a typo in the arglist will lead
to another style warning "Undefined variable A assumed special".
--
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/242>
armedbear <http://common-lisp.net/project/armedbear>
armedbear
#231: DEFSTRUCT accessor functions overwrite accessors in :INCLUDEd structs
------------------------+---------------------------------------------------
Reporter: ehuelsmann | Owner: mevenson
Type: defect | Status: new
Priority: major | Milestone: 1.1.0
Component: libraries | Version:
Keywords: |
------------------------+---------------------------------------------------
Ralf Moeller reports:
The following file causes a problem in ABCL (1.1.0-dev-svn-14041) when
compiled (!) and loaded.
(in-package cl-user)
(defstruct a (s1 nil))
(defstruct (b (:include a) (:conc-name foo-)) (s2 nil))
(defstruct (c (:include a) (:conc-name foo-)) (s3 nil))
(defun test ()
(let ((x (make-b :s1 1 :s2 2)))
(foo-s1 x)))
CL-USER(4): (test)
#<THREAD "interpreter" {2EF7D41F}>: Debugger invoked on condition of type
SIMPLE-TYPE-ERROR
The value #<B {564434F7}> is not of type C.
Restarts:
0: TOP-LEVEL Return to top level.
[1] CL-USER(6): (lisp-implementation-version)
"1.1.0-dev-svn-14041"
[1] CL-USER(7):
The problem is that the defstruct declaration for c "overwrites" the
accessor foo-s1 generated by defstruct b.
If foo-s1 is called for a b instance, the type assertions introduced by
define-reader (and define-writer, see the
ABCL implementation for defstruct) cause the error described above.
--
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/231>
armedbear <http://common-lisp.net/project/armedbear>
armedbear
#165: pprint-logical-block fails for format with list directive
----------------------------+-----------------------------------------------
Reporter: mevenson | Owner: somebody
Type: defect | Status: new
Priority: major | Milestone: 0.27
Component: other | Version: 0.27
Keywords: sbcl-buildhost |
----------------------------+-----------------------------------------------
Derived from the problems getting SBCL to compile, the following test
fails with complaints in the XP package:
{{{
(defparameter *stream* *error-output*)
(defun pprint-test ()
(pprint-logical-block (*stream* nil :prefix "---")
(format *stream* "~(~A~)" '(1 2 3 4))))
}}}
with this error
{{{
The value #S(XP::XP-STRUCTURE :BASE-STREAM #S(SLIME-OUTPUT-STREAM) :LINE-
LENGTH 70 :LINE-LIMIT NIL :LINE-NO 1 :DEPTH-IN-BLOCKS 2 :BLOCK-STACK #(0 0
3 NIL NIL NIL NIL NIL NIL NIL ...) :BLOCK-STACK-PTR 2 :BUFFER … is not of
type STREAM.
[Condition of type TYPE-ERROR]
--
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/165>
armedbear <http://common-lisp.net/project/armedbear>
armedbear
#118: Lisp.getUpgradedElementType returns more types than supported by
'make_array.java'
------------------------+---------------------------------------------------
Reporter: ehuelsmann | Owner: nobody
Type: defect | Status: new
Priority: major | Milestone:
Component: libraries | Version:
Keywords: |
------------------------+---------------------------------------------------
The above leads to possible failure: each upgraded element type has its
own associated defaultInitialValue. If the code does not specify the right
initial value, NIL is taken, which probably is not a good fit.
--
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/118>
armedbear <http://common-lisp.net/project/armedbear>
armedbear