From: Ivan Z. <mel...@me...> - 2013-05-19 18:30:15
|
How's the logical host SYS implemented in GNU/Linux? Or more specifically, can one access the local file system through it? Or is it even a good idea? Thanks! |
From: Pascal J. B. <pj...@in...> - 2013-05-19 21:39:52
|
Ivan Zaigralin <mel...@me...> writes: > How's the logical host SYS implemented in GNU/Linux? Or more specifically, > can one access the local file system through it? Or is it even a good idea? On my system, (LOGICAL-PATHNAME-TRANSLATIONS "SYS") --> ((#P"SYS:;*.LISP" "*.lisp") (#P"SYS:;*" "*") (#P"SYS:*" "/*")) So by default there are translations only for files with type LISP or with no type, as relative path or as absolute path: SYS:;EXAMPLE.LISP --> example.lisp SYS:;EXAMPLE --> example SYS:EXAMPLE.LISP --> /example.lisp SYS:EXAMPLE --> /example Those are the only file patterns you can access with those logical pathname translations. Logical pathnames, and logical hosts, are not designed to access the local file system. They are designed to map lisp logical pathnames to a local file system, so that you can access files created by THE lisp system and stored on the host file system. There is absolutely no provision to let you access random files from the local file system. It's not made for that. To access files from the local file system, use physical pathnames. (And even, in some implementations it's even hard to compose physical pathname to access random existing files). Now, you can write logical pathname translations that let you access files in arbitrary recursive directories starting from the root of the file system: (setf (logical-pathname-translations "FS") nil (logical-pathname-translations "FS") '((#P"FS:**;*.*" "/**/*.*") (#P"FS:**;*" "/**/*"))) But again, this won't let you access random files given a logical pathname: C/USER[18]> (probe-file #P"FS:TMP;.X0-LOCK") *** - PROBE-FILE: No file name given: #P"/tmp/.x0-lock" There is a /tmp/.X0-lock file thought. However, you could do: C/USER[29]> (push '(#P"FS:TMP;X0.LOCK" "/tmp/.X0-lock") (logical-pathname-translations "FS")) ((#P"FS:TMP;X0.LOCK" "/tmp/.X0-lock") (#P"FS:**;*.*" "/**/*.*")) C/USER[30]> (probe-file #P"FS:TMP;X0.LOCK") #P"/tmp/.X0-lock" So if you already know the list of all the paths available in the local file system, then you could fill a logical pathname translations map to give each of them a logical pathname. But that's clearly not what it was designed for. -- __Pascal Bourguignon__ http://www.informatimago.com/ A bad day in () is better than a good day in {}. You can take the lisper out of the lisp job, but you can't take the lisp out of the lisper (; -- antifuchs |
From: Ivan Z. <mel...@me...> - 2013-06-19 19:16:38
|
Hi again! I must be pretty dim, but I can't find any coherent description of the logical pathname translation syntax. What I want is for > "HOST:a;b;c;d;e;f" to be translated into something like > "/usr/share/a/b/c/d/e/f.fas" I figured that > (setf (logical-pathname-translations "HOST") '(("*" "/usr/share/**.fas"))) seems to produce the desired result on strings like "HOST:a" but not "HOST:a;b" At the same time, > (setf (logical-pathname-translations "HOST") '(("**;*" "/usr/share/**/"))) allows to translate "HOST:a;b;c" into "/usr/share/a/b/c" but I can't figure out how to tack on the extension. P.S. Sorry, Pascal J. Bourguignon, I know, I keep sending you doubles by mistake. |
From: Pascal J. B. <pj...@in...> - 2013-06-19 19:50:39
|
Ivan Zaigralin <mel...@me...> writes: > Hi again! I must be pretty dim, but I can't find any coherent > description of the logical pathname translation syntax. What I want > is for > >> "HOST:a;b;c;d;e;f" > > to be translated into something like > >> "/usr/share/a/b/c/d/e/f.fas" > > I figured that > >> (setf (logical-pathname-translations "HOST") '(("*" "/usr/share/**.fas"))) You should have more occurences of "**" on the left side than on the right side, and more occurences of "*" on the left side than on the right side. > seems to produce the desired result on strings like "HOST:a" but not "HOST:a;b" > > At the same time, > >> (setf (logical-pathname-translations "HOST") '(("**;*" "/usr/share/**/"))) > > allows to translate "HOST:a;b;c" into "/usr/share/a/b/c" but I can't figure out > how to tack on the extension. Just tack it on: (setf (logical-pathname-translations "HOST") '(("**;*.*" "/usr/share/**/*.*"))) CL-USER> (setf (logical-pathname-translations "SHARE") '(("**;*.*" "/usr/share/**/*.*"))) ((#P"SHARE:**;*.*" "/usr/share/**/*.*")) CL-USER> (translate-logical-pathname #P"SHARE:A;B;C;F.T") #P"/usr/share/a/b/c/f.t" CL-USER> (translate-logical-pathname #P"SHARE:A;B;C;F") #P"/usr/share/a/b/c/f" CL-USER> (translate-logical-pathname #P"SHARE:A;B;C;F.T.NEWEST") #P"/usr/share/a/b/c/f.t" CL-USER> (translate-logical-pathname #P"SHARE:A;B;C;F.T.42") #P"/usr/share/a/b/c/f.t" > P.S. Sorry, Pascal J. Bourguignon, I know, I keep sending you doubles by > mistake. No problem. -- __Pascal Bourguignon__ http://www.informatimago.com/ A bad day in () is better than a good day in {}. You know you've been lisping too long when you see a recent picture of George Lucas and think "Wait, I thought John McCarthy was dead!" -- Dalek_Baldwin |
From: Ivan Z. <mel...@me...> - 2013-06-20 01:40:31
|
I see... But I want translate-logical-pathname to do the work :) I think I found a solution, though. [68]> (setf (logical-pathname-translations "host") '(("**;*.lisp" "/usr/share/lisp/**/*.fas"))) ((#S(LOGICAL-PATHNAME :HOST "HOST" :DEVICE :UNSPECIFIC :DIRECTORY (:ABSOLUTE :WILD-INFERIORS) :NAME :WILD :TYPE "LISP" :VERSION NIL) "/usr/share/lisp/**/*.fas")) [69]> (translate-logical-pathname "host:foo.lisp") #P"/usr/share/lisp/foo.fas" [71]> (translate-logical-pathname "host:mew;moo;foo.lisp") #P"/usr/share/lisp/mew/moo/foo.fas" My problem was, I was trying to feed it names without extensions, and I think that was parsed as a directory. Now I can load everything as .lisp, but have the local host decide whether to feed me lisp or byte code. |