guile-user
[Top][All Lists]
Advanced

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

Re: Breaking hygiene with syntax-rules?


From: Walter Lewis
Subject: Re: Breaking hygiene with syntax-rules?
Date: Fri, 11 Aug 2023 09:34:55 -0400

Hi Jean,

On 8/11/23 4:00 AM, Jean Abou Samra wrote:
This is a known limitation in Guile. Please read
https://www.gnu.org/software/guile/manual/html_node/Hygiene-and-the-Top_002dLevel.html

I expect that you would be able to fix your macro by using

(define binding-you-want-to-report
  (let ((private-binding ...) ...)
   expr...))

or

(define-values (binding-to-export-1 binding-to-export-2 ...)
  (let ((private-binding ...) ...)
    (values expr1 expr2 ...)))

Unfortunately this won't work for my use case, since I am writing a helper to generate record type definitions. The code is something like this (slightly simplified for now):

(use-modules (srfi srfi-9) (system foreign))

(define-syntax define-ffi-wrapper
  ((_ size
      name wrap unwrap predicate
      to-pointer from-pointer)
   (begin
     (define-record-type name
      (wrap bv pointer)
      predicate
      (pointer get-pointer set-pointer!))
     (define (to-pointer x)
       (or (get-pointer x)
           (let ((pointer (bytevector->pointer x)))
             (set-pointer! x pointer)
             pointer)))
     (define (from-pointer pointer)
       (wrap (pointer->bytevector pointer size)
             #f)))))

Basically it is a wrapper similar to define-wrapped-pointer-type, except when you cast it to a pointer it memoizes the pointer for later. (It's actually inspired by the vec2 implementation in Dave Thompson's Chickadee.) I wanted to avoid writing all this boilerplate by hand for each wrapper type, but I ran into this shadowing issue with the internal definitions such as get-pointer and set-pointer!.


reply via email to

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