Re: Minimal foreign error API Lassi Kortela 28 Jul 2020 12:26 UTC

Here's how you could let the caller know about the available languages:

(define (plist-keys plist)
   (let loop ((plist plist) (keys '()))
     (if (and (pair? plist) (pair? (cdr plist)))
         (loop (cddr plist) (cons (car plist) keys))
         (reverse keys))))

(define (make-translated-error . translations)
   (let ((languages (plist-keys translations))
         (first-one (cadr translations)))
     (make-foreign-error
      'languages
      languages
      'message
      (case-lambda
        (()
         first-one)
        ((language)
         (plist-get/default translations language first-one))))))

(let ((e (make-translated-error
           'en "Hello world"
           'de "Hallo Welt"
           'fi "Hei maailma")))
   (disp (foreign-error-ref e 'message))
   (disp (foreign-error-ref e 'languages))
   (for-each (lambda (language)
               (disp (foreign-error-ref e 'message language)))
             (foreign-error-ref e 'languages)))

;; Output:

Hello world
(en de fi)
Hello world
Hallo Welt
Hei maailma