После этого вопроса: Странные символы в 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...