#> #define STATUS_OK 0 #define STATUS_BUSY 1 #define STATUS_FAIL 2 static int _status = STATUS_OK; int get_status() { return _status; } void set_status(int s) { _status = s; } <# (module enum-1 (status->int int->status get-status set-status busy?) (import scheme chicken foreigners) (define-foreign-enum-type (foo:status int) (status->int int->status) ((ok status/ok) STATUS_OK) ((busy status/busy) STATUS_BUSY) ((fail status/fail) STATUS_FAIL)) (define get-status (foreign-lambda foo:status "get_status")) (define set-status (foreign-lambda void "set_status" foo:status)) (define (busy? s) (= s status/busy)) ) (require-extension test) (import enum-1) (test "status->int" 1 (status->int 'busy)) (test "int->status" 'fail (int->status 2)) (set-status 'busy) (test "get-status" 'busy (get-status)) (test "status/busy via busy?" #t (busy? (status->int (get-status)))) ;; Normally won't work, however status/fail is a foreign-variable and ;; therefore visible inside entire compilation unit. (test "status/fail" 'fail (int->status status/fail))