147 lines
2.1 KiB
Text
147 lines
2.1 KiB
Text
|
|
(* comment *)
|
||
|
|
|
||
|
|
#define pi 3.14
|
||
|
|
f(1)
|
||
|
|
#define f(x) x+pi
|
||
|
|
f(2)
|
||
|
|
#undef pi
|
||
|
|
f(3)
|
||
|
|
|
||
|
|
#ifdef g
|
||
|
|
"g" is defined
|
||
|
|
#else
|
||
|
|
"g" is not defined
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#define a(x) b()
|
||
|
|
#define b(x) a()
|
||
|
|
a()
|
||
|
|
|
||
|
|
debug("a")
|
||
|
|
debug("b")
|
||
|
|
|
||
|
|
#define z 123
|
||
|
|
#define y z
|
||
|
|
#define x y
|
||
|
|
|
||
|
|
#if x lsl 1 = 2*123
|
||
|
|
|
||
|
|
#if 1 = 2
|
||
|
|
#error "test"
|
||
|
|
#endif
|
||
|
|
|
||
|
|
success
|
||
|
|
#else
|
||
|
|
failure
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#define test_multiline \
|
||
|
|
"abc\
|
||
|
|
xyz
|
||
|
|
def" \
|
||
|
|
(* 123 \
|
||
|
|
789
|
||
|
|
456 *)
|
||
|
|
test_multiline
|
||
|
|
|
||
|
|
#define test_args(x, y) x y
|
||
|
|
test_args("a","b")
|
||
|
|
|
||
|
|
#define test_argc(x) x y
|
||
|
|
test_argc(aa\,bb)
|
||
|
|
|
||
|
|
#define test_esc(x) x
|
||
|
|
test_esc(\,\)\()
|
||
|
|
|
||
|
|
blah #define xyz
|
||
|
|
#ifdef xyz
|
||
|
|
#error "xyz should not have been defined"
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#define sticky1(x) _
|
||
|
|
#define sticky2(x) sticky1()_ (* the 2 underscores should be space-separated *)
|
||
|
|
sticky2()
|
||
|
|
|
||
|
|
#define empty1
|
||
|
|
#define empty2 +empty1+ (* there should be some space between the pluses *)
|
||
|
|
empty2
|
||
|
|
|
||
|
|
(* (* nested comment with single single quote: ' *) "*)" *)
|
||
|
|
|
||
|
|
#define arg
|
||
|
|
obj
|
||
|
|
\# define arg
|
||
|
|
|
||
|
|
' (* lone single quote *)
|
||
|
|
|
||
|
|
#define one 1
|
||
|
|
one = 1
|
||
|
|
|
||
|
|
#undef x
|
||
|
|
#define x #
|
||
|
|
x is #
|
||
|
|
|
||
|
|
#undef one
|
||
|
|
#define one 1
|
||
|
|
#if (one+one = 100 + \
|
||
|
|
64 lsr 3 / 4 - lnot lnot 100) && \
|
||
|
|
1 + 3 * 5 = 16 && \
|
||
|
|
22 mod 7 = 1 && \
|
||
|
|
lnot 0 = 0xffffffffffffffff && \
|
||
|
|
-1 asr 100 = -1 && \
|
||
|
|
-1 land (1 lsl 1 lsr 1) = 1 && \
|
||
|
|
-1 lor 1 = -1 && \
|
||
|
|
-2 lxor 1 = -1 && \
|
||
|
|
lnot -1 = 0 && \
|
||
|
|
true && not false && defined one && \
|
||
|
|
(true || true && false)
|
||
|
|
good maths
|
||
|
|
#else
|
||
|
|
#error "math error"
|
||
|
|
#endif
|
||
|
|
|
||
|
|
|
||
|
|
#undef f
|
||
|
|
#undef g
|
||
|
|
#undef x
|
||
|
|
#undef y
|
||
|
|
|
||
|
|
#define trace(f) \
|
||
|
|
let f x = \
|
||
|
|
printf "call %s\n%!" STRINGIFY(f); \
|
||
|
|
let y = f x in \
|
||
|
|
printf "return %s\n%!" STRINGIFY(f); \
|
||
|
|
y \
|
||
|
|
;;
|
||
|
|
|
||
|
|
trace(g)
|
||
|
|
|
||
|
|
#define field(name,type) \
|
||
|
|
val mutable name : type option \
|
||
|
|
method CONCAT(get_, name) = name \
|
||
|
|
method CONCAT(set_, name) x = name <- Some x
|
||
|
|
|
||
|
|
class foo () =
|
||
|
|
object
|
||
|
|
field(field_1, int)
|
||
|
|
field(field_2, string)
|
||
|
|
end
|
||
|
|
|
||
|
|
#define DEBUG(x) \
|
||
|
|
(if !debug then \
|
||
|
|
eprintf "[debug] %s %i: " __FILE__ __LINE__; \
|
||
|
|
eprintf x; \
|
||
|
|
eprintf "\n")
|
||
|
|
DEBUG("test1 %i %i" x y)
|
||
|
|
DEBUG("test2 %i" x)
|
||
|
|
|
||
|
|
#include "incl.cppo"
|
||
|
|
# 123456
|
||
|
|
|
||
|
|
#789 "test"
|
||
|
|
#include "incl.cppo"
|
||
|
|
|
||
|
|
#define debug(s) Printf.eprintf "%S %i: %s\n%!" __FILE__ __LINE__ s
|
||
|
|
|
||
|
|
end
|