Skip to content

Instantly share code, notes, and snippets.

@waywardmonkeys
Created December 5, 2015 04:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save waywardmonkeys/36a6295a28fa3fe3e9b9 to your computer and use it in GitHub Desktop.
Save waywardmonkeys/36a6295a28fa3fe3e9b9 to your computer and use it in GitHub Desktop.
enumeration in dylan?
Module: posix-sockets
Synopsis: Auto-generated bindings for the POSIX sockets API.
Author: Bruce Mitchener, Jr.
Copyright: See LICENSE file in this distribution.
define primary class <enumerated-value> (<object>)
constant slot enumerated-value :: <integer>,
required-init-keyword: value:;
constant slot enumerated-name :: <string>,
required-init-keyword: name:;
end class <enumerated-value>;
define constant <enumerated-value-vector> = limited(<vector>, of: <enumerated-value>);
define generic enumeration-values
(class :: <class>)
=> (values :: <enumerated-value-vector>);
define macro enumeration-definer
{ define enumeration ?class-name:name ?values:* end }
=> { define enumeration-class ?class-name end;
define-enumeration-values (?class-name) ?values end;
define enumeration-utils ?class-name ?values end; }
end macro enumeration-definer;
define macro enumeration-class-definer
{ define enumeration-class ?class-name:name end }
=> {
define sealed class ?class-name (<enumerated-value>)
end class ?class-name;
}
end macro enumeration-class-definer;
define macro define-enumeration-values
{ define-enumeration-values (?class-name:name) end } => { }
{ define-enumeration-values (?class-name:name) ?name:expression => ?value:expression; ?more:* end }
=> {
define constant ?name = make(?class-name, value: ?value, name: "?name");
define-enumeration-values (?class-name) ?more end;
}
end macro define-enumeration-values;
define macro enumeration-utils-definer
{ define enumeration-utils ?:name ?values:* end }
=> {
define constant ?name ## "-values" :: <enumerated-value-vector>
= as(<enumerated-value-vector>, vector(?values));
define method enumeration-values
(class == ?name)
=> (values :: <enumerated-value-vector>)
?name ## "-values"
end;
}
values:
{ } => { }
{ ?name:expression => ?value:expression; ... }
=> { ?name, ... }
end macro enumeration-utils-definer;
define enumeration <address-family>
$AF-INET => raw/$AF-INET;
$AF-INET6 => raw/$AF-INET6;
$AF-UNIX => raw/$AF-UNIX;
$AF-UNSPEC => raw/$AF-UNSPEC;
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment