| 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 |  | 
|---|