aboutsummaryrefslogtreecommitdiff
path: root/module/c/cpp-environment
diff options
context:
space:
mode:
Diffstat (limited to 'module/c/cpp-environment')
-rw-r--r--module/c/cpp-environment/function-like-macro.scm25
-rw-r--r--module/c/cpp-environment/internal-macro.scm11
-rw-r--r--module/c/cpp-environment/object-like-macro.scm18
3 files changed, 54 insertions, 0 deletions
diff --git a/module/c/cpp-environment/function-like-macro.scm b/module/c/cpp-environment/function-like-macro.scm
new file mode 100644
index 00000000..59b47c9c
--- /dev/null
+++ b/module/c/cpp-environment/function-like-macro.scm
@@ -0,0 +1,25 @@
+(define-module (c cpp-environment function-like-macro)
+ :use-module (hnh util object)
+ :use-module (hnh util type)
+ :use-module ((c lex2) :select (lexeme?))
+ :use-module ((c unlex) :select (unlex))
+ :export (function-like-macro
+ function-like-macro?
+ identifier
+ identifier-list
+ body
+ variadic?))
+
+(define-type (function-like-macro
+ printer: (lambda (r p)
+ (format p "#<#define ~a~a ~a>"
+ (identifier r)
+ (append (identifier-list r)
+ (if (variadic? r)
+ '("...") '()))
+ (unlex (body r)))))
+ (identifier type: string?)
+ (identifier-list type: (list-of string?))
+ (body type: (list-of lexeme?))
+ (variadic? type: boolean?
+ default: #f))
diff --git a/module/c/cpp-environment/internal-macro.scm b/module/c/cpp-environment/internal-macro.scm
new file mode 100644
index 00000000..3c946738
--- /dev/null
+++ b/module/c/cpp-environment/internal-macro.scm
@@ -0,0 +1,11 @@
+(define-module (c cpp-environment internal-macro)
+ :use-module (hnh util object)
+ :export (internal-macro
+ internal-macro?
+ identifier body))
+
+(define-type (internal-macro)
+ (identifier type: string?)
+ (body type: procedure?
+ ;; Arity 2
+ ))
diff --git a/module/c/cpp-environment/object-like-macro.scm b/module/c/cpp-environment/object-like-macro.scm
new file mode 100644
index 00000000..90a3ad23
--- /dev/null
+++ b/module/c/cpp-environment/object-like-macro.scm
@@ -0,0 +1,18 @@
+(define-module (c cpp-environment object-like-macro)
+ :use-module (hnh util object)
+ :use-module (hnh util type)
+ :use-module ((c lex2) :select (lexeme?))
+ :use-module ((c unlex) :select (unlex))
+ :export (object-like-macro
+ object-like-macro?
+ identifier
+ body))
+
+
+(define-type (object-like-macro
+ printer: (lambda (r p)
+ (format p "#<#define ~a ~a>"
+ (identifier r)
+ (unlex (body r)))))
+ (identifier type: string?)
+ (body type: (list-of lexeme?)))