guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Meaning of symbol prefixed with "#$"


From: Daniel Meißner
Subject: Re: Meaning of symbol prefixed with "#$"
Date: Fri, 26 May 2023 20:22:26 +0200

Hi Ning!

ningyuan.sg@gmail.com writes:

> Hi all,
> 
> I was wondering what is the meaning of symbols prefixed with "#$", for
> example "#$version" in Guix package definitions.
> 
> I was trying to write a package definition for a python package whose
> version number was intended to be inferred from git metadata during build
> time via versioneer. However, since Guix does not retain git metadata
> during build, the setup.py statement declaring the version number as to be
> inferred from git metadata had to be changed to refer to a simple version
> number string. I wrote,
> 
> #+begin_src
> (arguments
>   '(#:phases (modify-phases %standard-phases
>     (add-after 'unpack 'amend-version
>       (lambda _
>         (substitute* "setup.py"
>           (("versioneer.get_version\\(\\)")
>           (string-append "\"" #$version "\"")))))
> #+end_src
> 
> With reference to a patch describing the same issue with a different python
> package with the same inferred git metadata version number issue:
> https://issues.guix.gnu.org/63628#0-lineno26.
> 
> However, I get an error I do not understand:
> 
> #+begin_src
> starting phase `amend-version'
> error: in phase 'amend-version': uncaught exception:
> unbound-variable #f "Unbound variable: ~S" (ungexp) #f
> #+end_src
> 
> I thought I could begin to debug this by understanding what "#$" means in
> "#$version".

The problem in your package definition is that you use an ungexp form outside 
of a gexp form. The correct code could be (untested):

  (arguments
    (list
     #:phases
     #~(modify-phases %standard-phases
         (add-after 'unpack 'amend-version
           (lambda _
             (substitute* "setup.py"
               (("versioneer.get_version\\(\\)")
                (string-append "\"" #$version "\"")))))

As already mentioned by Robby #$version is equivalent to (ungexp version) and 
similar to quasiquotation in Scheme.

Also: Be sure to import the (guix gexp) module. Otherwise gexp and ungexp might 
not be defined.

Best

-- 
Daniel





reply via email to

[Prev in Thread] Current Thread [Next in Thread]