From ddab1e71f1e90a86de3a9f5832b01aaa286cb80f Mon Sep 17 00:00:00 2001 From: mehbark Date: Wed, 2 Jul 2025 20:52:30 -0400 Subject: [PATCH] package up for the bot --- default.nix | 38 ++++++++++++++++++++++++++++++++ flake.lock | 48 ++++++++++++++++++++++++++++++++++++++++ flake.nix | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ result | 1 + src/eval.rs | 18 +++++++++++---- src/main.rs | 2 +- 6 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 default.nix create mode 100644 flake.lock create mode 100644 flake.nix create mode 120000 result diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..c423432 --- /dev/null +++ b/default.nix @@ -0,0 +1,38 @@ +# ty https://hoverbear.org/blog/a-flake-for-your-crate/ + +{ lib +, naersk +, stdenv +, clangStdenv +, hostPlatform +, targetPlatform +, pkg-config +, libiconv +, rustfmt +, cargo +, rustc +}: + +let + cargoToml = (builtins.fromTOML (builtins.readFile ./Cargo.toml)); +in + +naersk.lib."${targetPlatform.system}".buildPackage rec { + src = ./.; + + buildInputs = [ + rustfmt + pkg-config + cargo + rustc + ]; + checkInputs = [ cargo rustc ]; + + doCheck = true; + CARGO_BUILD_INCREMENTAL = "false"; + RUST_BACKTRACE = "full"; + copyLibs = true; + + name = cargoToml.package.name; + version = cargoToml.package.version; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..6ca07ab --- /dev/null +++ b/flake.lock @@ -0,0 +1,48 @@ +{ + "nodes": { + "naersk": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1745925850, + "narHash": "sha256-cyAAMal0aPrlb1NgzMxZqeN1mAJ2pJseDhm2m6Um8T0=", + "owner": "nmattia", + "repo": "naersk", + "rev": "38bc60bbc157ae266d4a0c96671c6c742ee17a5f", + "type": "github" + }, + "original": { + "owner": "nmattia", + "repo": "naersk", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1751382304, + "narHash": "sha256-p+UruOjULI5lV16FkBqkzqgFasLqfx0bihLBeFHiZAs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d31a91c9b3bee464d054633d5f8b84e17a637862", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "naersk": "naersk", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..be00cea --- /dev/null +++ b/flake.nix @@ -0,0 +1,63 @@ +# ty https://hoverbear.org/blog/a-flake-for-your-crate/ +{ + description = "puyo TWO"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + naersk.url = "github:nmattia/naersk"; + naersk.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = { self, nixpkgs, naersk }: + let + cargoToml = (builtins.fromTOML (builtins.readFile ./Cargo.toml)); + supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" ]; + forAllSystems = f: nixpkgs.lib.genAttrs supportedSystems (system: f system); + in + { + overlay = final: prev: { + "${cargoToml.package.name}" = final.callPackage ./. { inherit naersk; }; + }; + + packages = forAllSystems (system: + let + pkgs = import nixpkgs { + inherit system; + overlays = [ + self.overlay + ]; + }; + in + { + "${cargoToml.package.name}" = pkgs."${cargoToml.package.name}"; + }); + + + defaultPackage = forAllSystems (system: (import nixpkgs { + inherit system; + overlays = [ self.overlay ]; + })."${cargoToml.package.name}"); + + checks = forAllSystems (system: + let + pkgs = import nixpkgs { + inherit system; + overlays = [ + self.overlay + ]; + }; + in + { + format = pkgs.runCommand "check-format" + { + buildInputs = with pkgs; [ rustfmt cargo ]; + } '' + ${pkgs.rustfmt}/bin/cargo-fmt fmt --manifest-path ${./.}/Cargo.toml -- --check + ${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt --check ${./.} + touch $out # it worked! + ''; + "${cargoToml.package.name}" = pkgs."${cargoToml.package.name}"; + }); + }; + +} diff --git a/result b/result new file mode 120000 index 0000000..0fcf96e --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/ysnlms9yadny09279xks5h0k1dzx1iqa-puyo-lang-0.1.0 \ No newline at end of file diff --git a/src/eval.rs b/src/eval.rs index 9d8b4e9..948e5db 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -2,6 +2,7 @@ use core::fmt; use std::{ cell::RefCell, collections::{HashMap, hash_map::Entry}, + io::{self, Write}, ops, process, rc::Rc, }; @@ -181,8 +182,8 @@ fn eval<'a>(insts: &'a [Inst<'a>], stack: &mut Stack<'a>, env: &Rc stack.run_monadic(f64::floor), "round" => stack.run_monadic(f64::round), "expt" => stack.run_dyadic(f64::powf), - "=" => stack.run_dyadic(|a, b| if (a - b).abs() < 1e-10 { 1. } else { 0. }), - "<" => stack.run_dyadic(|a, b| if a < b { 1. } else { 0. }), + "=" => stack.run_dyadic(|a, b| ((a - b).abs() < 1e-10).into()), + "<" => stack.run_dyadic(|a, b| (a < b).into()), "dup" => { let top = stack.pop_default(); stack.push(top.clone()); @@ -195,7 +196,12 @@ fn eval<'a>(insts: &'a [Inst<'a>], stack: &mut Stack<'a>, env: &Rc { - println!("{}", stack.pop_default()); + print!("{}", stack.pop_default()); + } + "put" => { + #[allow(clippy::cast_sign_loss, clippy::cast_possible_truncation)] + let byte = stack.pop_num() as u8; + io::stdout().write_all(&[byte]).unwrap(); } "explode" => { eprintln!("I ESPLODED"); @@ -214,7 +220,11 @@ fn eval<'a>(insts: &'a [Inst<'a>], stack: &mut Stack<'a>, env: &Rc stack.push(env.borrow().get(var).expect("idk this var")), + _ => stack.push( + env.borrow() + .get(var) + .unwrap_or_else(|| panic!("unknown variable: {var}")), + ), }, Inst::Num(n) => stack.push(Val::Num(*n)), Inst::Call => { diff --git a/src/main.rs b/src/main.rs index 4bd1c61..3b4ae76 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,7 @@ fn main() { let _ = io::stdin().read_to_string(&mut src).unwrap(); let insts = parse(&src); - eprintln!("{}!\n{insts:#?}", Inst::Block(insts.clone())); + eprintln!("{}!", Inst::Block(insts.clone())); run(&insts); }