guile-user
[Top][All Lists]
Advanced

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

using guile like a awk filter in a C program.


From: Pierre LINDENBAUM
Subject: using guile like a awk filter in a C program.
Date: Fri, 10 May 2024 15:55:58 +0200


Hi all,

I tried to learn guile a few years ago with a side project that went nowhere.

I'm now back with guile that I would like to use as a filter, just like awk, for my data.
I've got question about the general design of such program.

My program uses a C library ( https://github.com/samtools/htslib ) scanning mutations/variants in large VCF files ( https://en.wikipedia.org/wiki/Variant_Call_Format ).

A typical C program looks like (pseudo code) ;

        ```
        header = read_header(input);
        variant = new_variant();
        while(read_variant(input,header,variant)) {
                do_something(header,variant)
                }
        dispose_variant(variant)
        dispose_header(header)
        ```

I would like to use guile to filter VCF using a custom user GUILE expression/program . So my program would now look like

        ```
        header = read_header(input);
        guile_context = my_initialize_guile(header, argc_argv_user_script)
        variant = new_variant();
        while(read_variant(input,header,variant)) {
                if(!my_guile_test(guile_context,header,variant)) {
                        continue;
                        }
                do_something(header,variant)
                }
        dispose_variant(variant)
        my_dispose_guile(guile_context)
        dispose_header(header)
        ```

and would may be be invoked like:

```
./a.out -e '(and (variant-is-snp? ) (equals? (variant-allele-count) 2))' input.vcf > output.vcf
```

where `variant-is-snp` would test if the current variant in the 'while' loop is a 'single nucleotide polylmorphism' using `bcf_is_snp` https://github.com/samtools/htslib/blob/develop/htslib/vcf.h#L889


So my questions are:

- is it possible to use guile for such task ? More precisely, can I compile the guile script just once in `my_initialize_guile` and use it in the while loop without having to recompile it. - furthermore, what's the best practice to include the user's script in a larger script that would include the definitions of `variant-is-snp?` , `variant-allele-count`, etc... - is there any implementation that works like this (something like a AWK script in guile) ? - is there any way to make the program stateless ? I mean, any invocation of `my_guile_test` would erase the definition of the previous variant

Thanks for your answers,

Pierre L



reply via email to

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