From b541eede94f83e4e75a5b9e62ef133f399e31bfa Mon Sep 17 00:00:00 2001 From: Ben Greenman Date: Wed, 25 May 2016 18:30:53 -0400 Subject: [PATCH] [popl] some Rust code --- popl-2017/src/README.md | 19 +++++++++++++++++++ popl-2017/src/rust/Makefile | 9 +++++++++ popl-2017/src/rust/const.rs | 31 +++++++++++++++++++++++++++++++ popl-2017/src/rust/format.rs | 8 ++++++++ popl-2017/src/rust/map.rs | 0 popl-2017/src/rust/regexp.rs | 5 +++++ popl-2017/src/rust/vector.rs | 0 7 files changed, 72 insertions(+) create mode 100644 popl-2017/src/README.md create mode 100644 popl-2017/src/rust/Makefile create mode 100644 popl-2017/src/rust/const.rs create mode 100644 popl-2017/src/rust/format.rs create mode 100644 popl-2017/src/rust/map.rs create mode 100644 popl-2017/src/rust/regexp.rs create mode 100644 popl-2017/src/rust/vector.rs 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