| 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 | ### Use an implicit type for merging |
|---|
| 103 | |
|---|
| 104 | In the case for which a merge occurs when DEFAULT-PATHNAME |
|---|
| 105 | is a JAR-PATHNAME and the following conditions hold: |
|---|
| 106 | |
|---|
| 107 | 1. HOST and DEVICE of the PATHNAME are NIL |
|---|
| 108 | |
|---|
| 109 | 2. The DIRECTORY of the PATHNAME represents an absolute path. |
|---|
| 110 | |
|---|
| 111 | 3. We are not on Windows. |
|---|
| 112 | |
|---|
| 113 | we set the DEVICE to be :UNSPECIFIC. |
|---|
| 114 | |
|---|
| 115 | ### COLOPHON |
|---|
| 116 | |
|---|
| 117 | Mark <evenson@panix.com> |
|---|
| 118 | Created: 01-SEP-2012 |
|---|
| 119 | Revised: 09-OCT-2012 |
|---|
| 120 | |
|---|