Hello Guile Users!

I've hit a weird issue when trying to display the path to the directory
of a source code file. The following experimental code I put into a file:

~~~~START: example.scm~~~~
(display
 (simple-format
  #f "~a\n"
  (dirname (current-filename))))
~~~~END~~~~~~~~~~~~~~~~~~~

Then I wanted to try, whether the output changes, depending on from
which directory I call:

~~~~START~~~~
guile example.scm
~~~~END~~~~~~

from

/home/user/dev/Guile/examples-and-convenience-procedures/file-system

The output was:

~~~~START~~~~
/home/user/dev/Guile/examples-and-convenience-procedures/file-system
~~~~END~~~~~~

As I expected. Then I tried from one directory up:

~~~~START~~~~
guile file-system/example.scm
~~~~END~~~~~~

And the output stayed the same. Satisfied, that the output stays the
same, I renamed the file into something more meaningful. (btw.: If there
is a better way to get the path of the directory of a file, please let
me know!) Then something weird happened:

~~~~START~~~~

user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$ mv 
example.scm display-dir-of-file.scm
user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$ guile 
display-dir-of-file.scm 
Backtrace:
In ice-9/boot-9.scm:
  1736:10  7 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _)
In unknown file:
           6 (apply-smob/0 #<thunk 7f82ac5434c0>)
In ice-9/boot-9.scm:
    718:2  5 (call-with-prompt ("prompt") #<procedure 7f82ac5568e0 at ice…> …)
In ice-9/eval.scm:
    619:8  4 (_ #(#(#<directory (guile-user) 7f82ac17ef00>)))
In ice-9/boot-9.scm:
   2806:4  3 (save-module-excursion #<procedure 7f82ac1711b0 at ice-9/boot…>)
  4351:12  2 (_)
In display-dir-of-file.scm:
      4:2  1 (_)
In unknown file:
           0 (dirname #f)

ERROR: In procedure dirname:
In procedure scm_to_utf8_stringn: Wrong type argument in position 1 (expecting 
string): #f
user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$ mv 
display-dir-of-file.scm example.scm
user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$ guile 
example.scm 
/home/user/dev/Guile/examples-and-convenience-procedures/file-system
user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$ cp 
example.scm display-dir-of-file.scm
user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$ guile 
example.scm 
/home/user/dev/Guile/examples-and-convenience-procedures/file-system
user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$ guile 
display-dir-of-file.scm 
;;; note: source file 
/home/user/dev/Guile/examples-and-convenience-procedures/file-system/display-dir-of-file.scm
;;;       newer than compiled 
/home/user/.cache/guile/ccache/3.0-LE-8-4.3/home/user/dev/Guile/examples-and-convenience-procedures/file-system/display-dir-of-file.scm.go
;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;;       or pass the --no-auto-compile argument to disable.
;;; compiling 
/home/user/dev/Guile/examples-and-convenience-procedures/file-system/display-dir-of-file.scm
;;; compiled 
/home/user/.cache/guile/ccache/3.0-LE-8-4.3/home/user/dev/Guile/examples-and-convenience-procedures/file-system/display-dir-of-file.scm.go
/home/user/dev/Guile/examples-and-convenience-procedures/file-system
user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$ guile 
display-dir-of-file.scm 
/home/user/dev/Guile/examples-and-convenience-procedures/file-system
user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$ guile 
display-dir-of-file.scm 
/home/user/dev/Guile/examples-and-convenience-procedures/file-system
user@xlx200:~/dev/Guile/examples-and-convenience-procedures/file-system$

~~~~END~~~~~~

I also tried with `guile -L . ...` and `guile -L file-system ...` at
some point, but now it simply works and I cannot reproduce the error any
longer. It seems to have something to do with the file name itself. I
also don't see, why it would compile again after copying the file. So I
tested something:

If I move a file using `mv`, a recomplation seems to be not required. If
I copy the file instead, Guile recompiled it. Does this have something
to do with inodes or creation date, which is differently handled when
using `cp` instead of `mv`?

With the whole error thing, I am beginning to doubt myself, but I am
quite sure (99%), that I did not change the code in the file during the
whole process.

This was inside Emacs M-x shell. My GNU Guile is installed via GNU Guix
and is version 3.0.4.

Since it now seems to work, I am only concerned, that there might be a
bug somewhere. Or is there an explanation?

Regards,
Zelphir

-- 
repositories: https://notabug.org/ZelphirKaltstahl

Reply via email to