Subject: Re: [PATCH] gnu: Add guile-ts.

From: Andrew Tropin <[email-masked]>
Date: Fri, 27 Oct 2023 16:24:44 +0400

On 2023-10-26 23:03, Zheng Junjie wrote:

> * gnu/packages/guile-xyz.scm (guile-ts): New variable.
>
> Change-Id: Icb681b6f2e5f2318291e5a4a4ff05d2cbbcf1856
> ---
>  gnu/packages/guile-xyz.scm | 46 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 46 insertions(+)
>
> diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
> index 90f51cf741..0a2e0a04ae 100644
> --- a/gnu/packages/guile-xyz.scm
> +++ b/gnu/packages/guile-xyz.scm
> @@ -119,6 +119,7 @@ (define-module (gnu packages guile-xyz)
>    #:use-module (gnu packages tex)
>    #:use-module (gnu packages texinfo)
>    #:use-module (gnu packages tls)
> +  #:use-module (gnu packages tree-sitter)
>    #:use-module (gnu packages version-control)
>    #:use-module (gnu packages webkit)
>    #:use-module (gnu packages xdisorg)
> @@ -4588,6 +4589,51 @@ (define-public guile-torrent
>  according to Bitorrent BEP003.")
>      (license license:gpl3+)))
>  
> +(define-public guile-ts
> +  (package
> +    (name "guile-ts")
> +    (version "0.1.0")
> +    (source (origin (method git-fetch)
> +                    (uri (git-reference
> +                          (url
> +                           "https://github.com/Z572/guile-ts")
> +                          (commit (string-append "v" version))))
> +                    (file-name (git-file-name name version))
> +                    (sha256
> +                     (base32
> +                      "0xmq2d3mv921m0g1hqw6bjzh4m622g2c7pal11ks7vjn0m8d4bxj"))))
> +    (build-system gnu-build-system)
> +    (arguments
> +     (list #:make-flags #~(list "GUILE_AUTO_COMPILE=0")
> +           #:phases
> +           #~(modify-phases %standard-phases
> +               (add-after 'unpack 'set-extension-path
> +                 (lambda* (#:key outputs #:allow-other-keys)
> +                   (substitute*
> +                       (find-files "." ".*\\.scm")
> +                     (("\\(load-extension \"libguile_ts\" *\"(.*)\"\\)" _ o)
> +                      (string-append
> +                       (object->string
> +                        `(or (false-if-exception
> +                              (load-extension "libguile_ts" ,o))
> +                             (load-extension
> +                              ,(string-append
> +                                #$output
> +                                "/lib/libguile_ts.so")
> +                              ,o)))))))))))
> +    (native-inputs
> +     (list autoconf automake
> +           libtool
> +           texinfo
> +           pkg-config
> +           guile-3.0))
> +    (inputs (list guile-3.0 tree-sitter))
> +    (synopsis "Guile bindings to the Tree-sitter parsing library")
> +    (description "This package provides Guile bindings to the Tree-sitter
> +parsing library.")
> +    (home-page "https://github.com/Z572/guile-ts")
> +    (license license:gpl3+)))
> +
>  (define-public guile-irc
>    (let ((commit "7d08ce6fdcb87ac668c5d3bfd5584247805507bb")
>          (revision "1"))
>
> base-commit: 33f5b747b4a0a508e1ffc94a5bf425cff707c6e3

Tested the package with a following snippet of code:

--8<---------------cut here---------------start------------->8---
(use-modules (ts) (oop goops))
(define json-language
  (get-ts-language-from-file
   ;; Can be obtained automatically from TREE_SITTER_GRAMMAR_PATH
   "/gnu/store/537371mad55g34lkmzs3fzp33wh6kidk-profile/lib/tree-sitter/libtree-sitter-json.so"
   "tree_sitter_json"))
(display (ts-language-version json-language))

 (let* ((parser (make <ts-parser> #:language json-language))
        (tree (ts-parser-parse-string parser #f "[1,null, \"hi\"]")))
   (format #t "~s\n" (ts-node-sexp (ts-tree-root-node tree))))
--8<---------------cut here---------------end--------------->8---

guix shell guile guile-ts tree-sitter-json -- guile -s tmp.scm

Added native-search-paths to the package, so if it's installed in the
profile with tree-sitter grammars they are added to respective
environment variable.

--8<---------------cut here---------------start------------->8---
    (native-search-paths
     (list (search-path-specification
            (variable "TREE_SITTER_GRAMMAR_PATH")
            (files '("lib/tree-sitter")))))
--8<---------------cut here---------------end--------------->8---

Thank you for working on tree-sitter bindings, appreciate it very much!

Applied, slightly modified, pushed:
https://git.savannah.gnu.org/cgit/guix.git/commit/?id=fca99c89b8

-- 
Best regards,
Andrew Tropin