1 | # ISSUE MERGE-PATHNAMES with specialization of JAR-PATHNAME |
---|
2 | |
---|
3 | We wish to resolve the following issues. |
---|
4 | |
---|
5 | ## UC0 Loading jna.jar for CFFI via Quicklisp |
---|
6 | |
---|
7 | Currently we cannount load systems via ASDF recursively in jars, most |
---|
8 | importantly for those packaged in 'abcl-contrib.jar', which prevents |
---|
9 | CFFI from loading the necessary JNA code. |
---|
10 | |
---|
11 | ## UC1.1 |
---|
12 | If *DEFAULT-PATHNAME-DEFAULTS* is a JAR-PATHNAME, commands that would |
---|
13 | normally be expected to work such as |
---|
14 | |
---|
15 | CL-USER> (probe-file #p"/") |
---|
16 | |
---|
17 | will fail. |
---|
18 | |
---|
19 | ### UC1.2 |
---|
20 | |
---|
21 | If *DEFAULT-PATHNAME-DEFAULTS* is a JAR-PATHNAME, COMPILE-FILE |
---|
22 | operations specifying an OUTPUT-FILE with a NIL DEVICE will fail, as |
---|
23 | COMPILE-FILE-PATHNAME is required to merge its arguments with the |
---|
24 | defaults. |
---|
25 | |
---|
26 | ## CLHS Citations |
---|
27 | |
---|
28 | Some especially relevant portions of the CLHS for consideration. |
---|
29 | |
---|
30 | ### 19.2.3 Merging Pathnames |
---|
31 | http://www.lispworks.com/documentation/HyperSpec/Body/19_bc.htm |
---|
32 | |
---|
33 | "Except as explicitly specified otherwise, for functions that |
---|
34 | manipulate or inquire about files in the file system, the pathname |
---|
35 | argument to such a function is merged with *default-pathname-defaults* |
---|
36 | before accessing the file system (as if by merge-pathnames)." |
---|
37 | |
---|
38 | Note that this implies that the arguments to PARSE-NAMESTRING--which |
---|
39 | is what the SHARSIGN-P reader macro correpsponds to--should not be |
---|
40 | merged. |
---|
41 | |
---|
42 | |
---|
43 | ## 19.2.2.2.3 :UNSPECIFIC as a Component Value |
---|
44 | http://www.lispworks.com/documentation/HyperSpec/Body/19_bbbc.htm |
---|
45 | |
---|
46 | "If :unspecific is the value of a pathname component, the component is |
---|
47 | considered to be ``absent'' or to ``have no meaning'' in the filename |
---|
48 | being represented by the pathname." |
---|
49 | |
---|
50 | Having an :UNSPECIFIC DEVICE when a PATHNAME refers to a file would |
---|
51 | address problems when merging when the defaults contains a JAR-PATHNAME. |
---|
52 | |
---|
53 | ### MERGE-PATHNAMES |
---|
54 | http://www.lispworks.com/documentation/HyperSpec/Body/f_merge_.htm |
---|
55 | |
---|
56 | "If pathname explicitly specifies a host and not a device, and if the |
---|
57 | host component of default-pathname matches the host component of |
---|
58 | pathname, then the device is taken from the default-pathname; |
---|
59 | otherwise the device will be the default file device for that host. If |
---|
60 | pathname does not specify a host, device, directory, name, or type, |
---|
61 | each such component is copied from default-pathname." |
---|
62 | |
---|
63 | This suggests that the contents HOST should be considered as an |
---|
64 | additional axis of type for PATHNAME, so that when PATHNAMES of |
---|
65 | differing types get merged, a DEVICE which has no meaning for a given |
---|
66 | type does not get inserted. |
---|
67 | |
---|
68 | ## Other implementations |
---|
69 | |
---|
70 | A survey of the the "default" host for #p"/" on startup. |
---|
71 | |
---|
72 | ### SBCL |
---|
73 | |
---|
74 | A host nonce which appears in the reader as |
---|
75 | #<SB-IMPL::UNIX-HOST {1000290443}>. (Is there a different one under |
---|
76 | Windows?) |
---|
77 | |
---|
78 | ### CLISP |
---|
79 | |
---|
80 | HOST is NIL. |
---|
81 | |
---|
82 | ### CCL |
---|
83 | |
---|
84 | HOST is :UNSPECIFIC. |
---|
85 | |
---|
86 | ### ECL |
---|
87 | |
---|
88 | HOST is NIL. |
---|
89 | |
---|
90 | ## Implementation |
---|
91 | |
---|
92 | Since Windows systems do have a default DEVICE for a normal file |
---|
93 | PATHNAME, namely the current "drive letter" of the process, the |
---|
94 | implementation changes will be mostly wrapped in runtime conditionals |
---|
95 | for non-Windows systems. |
---|
96 | |
---|
97 | ### TRUENAME sets DEVICE to :UNSPECIFIC |
---|
98 | |
---|
99 | TRUENAME sets DEVICE to :UNSPECIFIC running on non-Windows when |
---|
100 | resolving a path to a plain file. |
---|
101 | |
---|
102 | |
---|
103 | ### DIRECTORY sets DEVICE to :UNSPECIFIC |
---|
104 | |
---|
105 | When the default for the :RESOLVE-SYMLINKS argument to DIRECTORY was |
---|
106 | changed to nil, DIRECTORY was changed not to always resolve its |
---|
107 | results via TRUENAME. As a result |
---|
108 | |
---|
109 | (equal (truename "~/.emacs") |
---|
110 | (first (directory "~/.emacs")) ) |
---|
111 | |
---|
112 | forms would return nil. This is a bit counter to expectations set by |
---|
113 | CLHS that DIRECTORY "returns a list of pathnames corresponding to the |
---|
114 | truenames". In particular, this breaks the ANSI CL DIRECTORY.[67] |
---|
115 | tests. Thus, under non-Windows we now explicitly normalize DEVICE |
---|
116 | components which are nil to :UNSPECIFIC for the results of DIRECTORY |
---|
117 | calls. |
---|
118 | |
---|
119 | ### Use an implicit type for merging |
---|
120 | |
---|
121 | In the case for which a merge occurs when DEFAULT-PATHNAME |
---|
122 | is a JAR-PATHNAME and the following conditions hold: |
---|
123 | |
---|
124 | 1. HOST and DEVICE of the PATHNAME are NIL |
---|
125 | |
---|
126 | 2. The DIRECTORY of the PATHNAME represents an absolute path. |
---|
127 | |
---|
128 | 3. We are not running under Windows. |
---|
129 | |
---|
130 | we set the DEVICE to be :UNSPECIFIC. |
---|
131 | |
---|
132 | ### COLOPHON |
---|
133 | |
---|
134 | Mark <evenson@panix.com> |
---|
135 | Created: 01-SEP-2012 |
---|
136 | Revised: 06-FEB-2014 |
---|
137 | |
---|