diff options
Diffstat (limited to 'examples/04-inductive-data-types')
12 files changed, 155 insertions, 0 deletions
diff --git a/examples/04-inductive-data-types/hobgoblin.json5 b/examples/04-inductive-data-types/hobgoblin.json5 new file mode 100644 index 0000000..12713d4 --- /dev/null +++ b/examples/04-inductive-data-types/hobgoblin.json5 @@ -0,0 +1,19 @@ +{ + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, + }, + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "rust-types", + path: "output/rust/src", + }, + ], + }, +} diff --git a/examples/04-inductive-data-types/output/java/.gitignore b/examples/04-inductive-data-types/output/java/.gitignore new file mode 100644 index 0000000..ff511d4 --- /dev/null +++ b/examples/04-inductive-data-types/output/java/.gitignore @@ -0,0 +1,2 @@ +/src/gen/ +/target/ diff --git a/examples/04-inductive-data-types/output/java/pom.xml b/examples/04-inductive-data-types/output/java/pom.xml new file mode 120000 index 0000000..445fa65 --- /dev/null +++ b/examples/04-inductive-data-types/output/java/pom.xml @@ -0,0 +1 @@ +../../../templates/java-junit/pom.xml
\ No newline at end of file diff --git a/examples/04-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java b/examples/04-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java new file mode 100644 index 0000000..08cb75c --- /dev/null +++ b/examples/04-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java @@ -0,0 +1,17 @@ +package org.zwobble.example; + +import org.zwobble.example.types.arithmetic.Add; +import org.zwobble.example.types.arithmetic.Const; +import org.zwobble.example.types.arithmetic.Expression; + +public class Arithmetic { + public static int eval(Expression expression) { + return switch (expression) { + case Add(var left, var right) -> + eval(left) + eval(right); + + case Const(var value) -> + value; + }; + } +} diff --git a/examples/04-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java b/examples/04-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java new file mode 100644 index 0000000..cd4fdd0 --- /dev/null +++ b/examples/04-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java @@ -0,0 +1,24 @@ +package org.zwobble.example; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.zwobble.example.types.arithmetic.Add; +import org.zwobble.example.types.arithmetic.Const; +import org.zwobble.example.types.arithmetic.Expression; + +public class ArithmeticTests { + @Test + public void eval() { + Expression expression = new Add( + new Add( + new Const(42), + new Const(47) + ), + new Const(52) + ); + + int result = Arithmetic.eval(expression); + + assertEquals(result, 141); + } +} diff --git a/examples/04-inductive-data-types/output/rust/.gitignore b/examples/04-inductive-data-types/output/rust/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/examples/04-inductive-data-types/output/rust/.gitignore @@ -0,0 +1 @@ +/target diff --git a/examples/04-inductive-data-types/output/rust/Cargo.lock b/examples/04-inductive-data-types/output/rust/Cargo.lock new file mode 100644 index 0000000..9dc6e3e --- /dev/null +++ b/examples/04-inductive-data-types/output/rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "example" +version = "0.1.0" diff --git a/examples/04-inductive-data-types/output/rust/Cargo.toml b/examples/04-inductive-data-types/output/rust/Cargo.toml new file mode 100644 index 0000000..5d4c622 --- /dev/null +++ b/examples/04-inductive-data-types/output/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "example" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/examples/04-inductive-data-types/output/rust/rust-toolchain.toml b/examples/04-inductive-data-types/output/rust/rust-toolchain.toml new file mode 100644 index 0000000..4fedb95 --- /dev/null +++ b/examples/04-inductive-data-types/output/rust/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.96" diff --git a/examples/04-inductive-data-types/output/rust/src/arithmetic.rs b/examples/04-inductive-data-types/output/rust/src/arithmetic.rs new file mode 100644 index 0000000..121c355 --- /dev/null +++ b/examples/04-inductive-data-types/output/rust/src/arithmetic.rs @@ -0,0 +1,30 @@ +// Generated by hobgoblin. + +#[derive(Debug, Hash, PartialEq)] +pub enum Expression { + Add(::std::boxed::Box::<crate::arithmetic::Add>), + Const(crate::arithmetic::Const), +} + +impl ::std::convert::From::<crate::arithmetic::Add> for crate::arithmetic::Expression { + fn from(value: crate::arithmetic::Add) -> Self { + Self::Add(::std::boxed::Box::new(value)) + } +} + +impl ::std::convert::From::<crate::arithmetic::Const> for crate::arithmetic::Expression { + fn from(value: crate::arithmetic::Const) -> Self { + Self::Const(value) + } +} + +#[derive(Debug, Hash, PartialEq)] +pub struct Add { + pub left: crate::arithmetic::Expression, + pub right: crate::arithmetic::Expression, +} + +#[derive(Debug, Hash, PartialEq)] +pub struct Const { + pub value: ::core::primitive::i32, +} diff --git a/examples/04-inductive-data-types/output/rust/src/lib.rs b/examples/04-inductive-data-types/output/rust/src/lib.rs new file mode 100644 index 0000000..3265e69 --- /dev/null +++ b/examples/04-inductive-data-types/output/rust/src/lib.rs @@ -0,0 +1,33 @@ +mod arithmetic; + +use arithmetic::{Const, Expression}; + +fn eval(expression: &Expression) -> i32 { + match expression { + Expression::Add(add) => + eval(&add.left) + eval(&add.right), + + Expression::Const(Const { value }) => + *value, + } +} + +#[cfg(test)] +mod test { + use super::arithmetic::{Add, Const, Expression}; + + #[test] + fn eval() { + let expression: Expression = Add { + left: Add { + left: Const { value: 42 }.into(), + right: Const { value: 47 }.into(), + }.into(), + right: Const { value: 52 }.into(), + }.into(); + + let result = super::eval(&expression); + + assert_eq!(result, 141); + } +} diff --git a/examples/04-inductive-data-types/src/arithmetic.hob b/examples/04-inductive-data-types/src/arithmetic.hob new file mode 100644 index 0000000..b1ef6e5 --- /dev/null +++ b/examples/04-inductive-data-types/src/arithmetic.hob @@ -0,0 +1,13 @@ +sum Expression { + variant Add box; + variant Const; +} + +struct Add { + field left: Expression; + field right: Expression; +} + +struct Const { + field value: Int32; +} |
