переводить-путь ведет себя странный

После этого вопроса: Странные символы в filespec, называя груз Я попытал своего счастья с путями, но, как вы видите, подведенный. Ниже пример ошибки, которую я не могу объяснить:

Этот код не работает:

(defun test-process-imgae-raw ()
  (cl-gd:with-image-from-file
      (test #P"digit-recognition:digit-7.png")
    (process-image-raw test)))

Ни один не делает это:

(defun test-process-imgae-raw ()
  (cl-gd:with-image-from-file
      (test "digit-recognition:digit-7.png")
    (process-image-raw test)))

Но этот код делает:

(defun test-process-imgae-raw ()
  (cl-gd:with-image-from-file
      (test (translate-logical-pathname "digit-recognition:digit-7.png"))
    (process-image-raw test)))

И так делает это:

(defun test-process-imgae-raw ()
  (cl-gd:with-image-from-file
      (test (translate-logical-pathname #P"digit-recognition:digit-7.png"))
    (process-image-raw test)))

Вот "переводчик":

(setf (logical-pathname-translations "DIGIT-RECOGNITION")
      `(("**;*.*" "/home/wvxvw/Projects/digit-recognition/**/*.*")))

И вот ошибка, которую я получаю:

Pathname components from SOURCE and FROM args to TRANSLATE-PATHNAME
did not match:
  :NEWEST NIL
   [Condition of type SIMPLE-ERROR]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [ABORT] Abort thread (#<thREAD "repl-thread" RUNNING {1003800113}>)

Backtrace:
  0: (SB-IMPL::DIDNT-MATCH-ERROR :NEWEST NIL)
  1: (SB-IMPL::TRANSLATE-COMPONENT :NEWEST NIL :NEWEST T)
  2: (TRANSLATE-PATHNAME #P"DIGIT-RECOGNITION:DIGIT-7.PNG.NEWEST" #P"DIGIT-RECOGNITION:**;*.*" #P"/home/wvxvw/Projects/digit-recognition/**/*.*")
  3: (TRANSLATE-LOGICAL-PATHNAME #P"DIGIT-RECOGNITION:DIGIT-7.PNG.NEWEST")
  4: (SB-IMPL::QUERY-FILE-SYSTEM #P"DIGIT-RECOGNITION:DIGIT-7.PNG" :TRUENAME NIL)
  5: (PROBE-FILE #P"DIGIT-RECOGNITION:DIGIT-7.PNG")
  6: (CREATE-IMAGE-FROM-FILE # NIL)
  7: (TEST-PROCESS-IMGAE-RAW)

Я пытаюсь прочитать раздел Hyperspec на переводить-пути, но я не могу иметь абсолютно никакого смысла того, что это говорит, ни один от примеров, которые это показывает. Уже не говоря о нем я не могу даже понять, как может возможно быть ошибка, если вы преобразовываете последовательность по любым правилам, вы кладете на место, до сих пор это - только один путь преобразование...

Я пытаюсь прочитать источники SBCL для этой функции, но они действительно длинны, и пытающийся выяснить проблему, которую этот путь занимает огромному количеству времени.

tl;dr How is it even possible that translate-logical-pathname called from user's code will produce something different to what is produced from that function if called from system code? This is not only non-portable, this is just outright broken.

ОТРЕДАКТИРУЙТЕ:

Добавление еще одной звездочки к образцу на левой стороне, но не справа решенный это. Но цель или логика того, почему это необходимо, вне меня.

Т.е.

(setf (logical-pathname-translations "DIGIT-RECOGNITION")
      `(("**;*.*.*" "/home/wvxvw/Projects/digit-recognition/**/*.*")))

Это позволяет путям как цифра-recognition:foo.bar.newest иметь успех, точно так же, как цифра-recognition:foo.bar , но почему та звездочка - требование мухи вне меня. Кроме того, почему системная функция чувствует, наделен правом изменить путь на что-то еще из того, что это было дано?.. Но просто не получить вас перепутанный, с изображением от файла будет только работать с путем, уже расширенным , "переводят логический путь" , это не будет работать иначе.

EDIT2:

Хорошо, кажется, что это - проблема с статья-gd , вместо того, чтобы пытаться расширить имя файла, это берет его буквально. Этот код, взятый из , создает изображение из файла , вероятно, лучше всего отвечает на мой вопрос:

(when (pathnamep file-name)
  (setq file-name
          #+:cmu (ext:unix-namestring file-name)
          #-:cmu (namestring file-name)))
(with-foreign-object (err :int)
  (with-cstring (c-file-name file-name)
    (let ((image (ecase %type
                   ((:jpg :jpeg)
                     (gd-image-create-from-jpeg-file c-file-name err))

Т.е. instead of doing (namestring file-name) it has to do (namestring (trnaslate-logical-pathname file-name)). Duh...

1
nl ja de

1 ответы

Иначе должен использовать TRUENAME , который возвращает реальное имя файла. Обычно это не имело бы значения.

Изображение файловая система с версиями файла (как файловые системы VMS...). Если у вас есть логический путь foo:bar; baz.png.newest , тогда это могло бы перевести, чтобы, скажем, /myfiles/images/baz.png~newest (снова, просто чтобы предположить, что у этого есть номера версий). Это все еще не реальный физический файл. Если такая система Шепелявости пытается открыть файл, она должна изучить файловую систему, чтобы на самом деле определить новейший файл. Это могло бы быть /myfiles/images/baz.png~42 .

Так, если вы хотите передать реальные физические имена файлов к внешним инструментам (как библиотека C), не могло бы быть достаточно расширить логический путь, но могло бы быть необходимо вычислить truename - реальный физический файл.

Способность иметь дело с версиями файла прибывает со времени, когда версии файла, где довольно распространенный (см. Файловая система управления версиями) с операционными системами как, VMS или различные операционные системы LISP-компьютера.

Главная практическая проблема для этого состоит в том, что нет никакого общего набора тестов для операций по пути для различных внедрений CL, и таким образом внедрения отличаются по большому количеству тонких деталей (особенно, когда необходимо иметь дело с различными файловыми системами от различных операционных систем). Плюс реальные файловые системы имеют осложнения - например, имена файлов в Mac OS X используют специальное кодирование unicode, имея дело с Умляутами.

0
добавлено
@wvxvw: некоторая функция (например ФАЙЛ ИССЛЕДОВАНИЯ ) могла бы добавить компонент вариантов до конца. Тогда *. * не мог бы соответствовать, но *.*. * .
добавлено автор Rainer Joswig, источник
pro.lisp
pro.lisp
47 участник(ов)

Common Lisp, Scheme/Racket, Clojure, Picolisp. S-expr