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