diff --git a/popl-2017/src/README.md b/popl-2017/src/README.md new file mode 100644 index 0000000..c48cac9 --- /dev/null +++ b/popl-2017/src/README.md @@ -0,0 +1,19 @@ +src +=== + +Code for "the paper". + +Just enough for examples and proofs-of-concept. +Real code belongs in a public repo, like: http://github.com/bennn/trivial + + +rust +--- + +Only have syntax rules, so can only elaborate. +- No constant folding +- No throwing compile-time exceptions +- No reading regexp strings + +But they have checked printf. How was that implemented? + diff --git a/popl-2017/src/rust/Makefile b/popl-2017/src/rust/Makefile new file mode 100644 index 0000000..ea4730e --- /dev/null +++ b/popl-2017/src/rust/Makefile @@ -0,0 +1,9 @@ +TARGETS=const format map regexp vector + +all: ${TARGETS} + +%: %.rs + rustc $< + +clean: + rm -f ${TARGETS} diff --git a/popl-2017/src/rust/const.rs b/popl-2017/src/rust/const.rs new file mode 100644 index 0000000..087131a --- /dev/null +++ b/popl-2017/src/rust/const.rs @@ -0,0 +1,31 @@ + + +macro_rules! plus { + // Nooo this doesn't actually compress things at compiletime + ( $( $n:expr ),* ) => { + { + let mut sum = 0; + $( + sum += $n; + )* + sum + } + }; +} + +macro_rules! div { + ( $num:expr , $den:expr ) => { + // NOPE error comes too late; will be same for vector ops + { if ($den == 0) { println!("Incoming division error"); }; + $num / $den; + } + }; +} + +fn main() { + let m = 0; + //let n = 1 / m; // unchecked + let n = div!(1, m); + //println!("result is {}", n); + return +} diff --git a/popl-2017/src/rust/format.rs b/popl-2017/src/rust/format.rs new file mode 100644 index 0000000..ea2126e --- /dev/null +++ b/popl-2017/src/rust/format.rs @@ -0,0 +1,8 @@ +// Rust's printf is typechecked + +fn main() { + + println!("Hello {:b}", "asdf"); + + return; +} diff --git a/popl-2017/src/rust/map.rs b/popl-2017/src/rust/map.rs new file mode 100644 index 0000000..e69de29 diff --git a/popl-2017/src/rust/regexp.rs b/popl-2017/src/rust/regexp.rs new file mode 100644 index 0000000..604065a --- /dev/null +++ b/popl-2017/src/rust/regexp.rs @@ -0,0 +1,5 @@ +macro_rules! regexp_match { + ( $x:string $y:expr ) => {{ + //if ... $x shit + }}; +} diff --git a/popl-2017/src/rust/vector.rs b/popl-2017/src/rust/vector.rs new file mode 100644 index 0000000..e69de29