summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--LICENSE21
-rw-r--r--README.md7
-rw-r--r--flake.lock26
-rw-r--r--flake.nix39
-rw-r--r--src/Calculator.java53
-rw-r--r--src/calculator.d49
-rw-r--r--src/calculator.hs22
-rw-r--r--src/calculator.rs58
-rw-r--r--src/calculator.swift41
10 files changed, 321 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c033348
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+calculator
+*.hi
+*.o
+*.class
+*.exe
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..171b89c
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 seth
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ff77b6f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+# calculators
+
+this is a collection of small calculator programs i make for random languages. enjoy!
+
+## playing with it
+
+this project has a dev shell that can be used with `nix develop`. it will include tools to compile all of the files in this repo
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..1ec4784
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,26 @@
+{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1688231357,
+ "narHash": "sha256-ZOn16X5jZ6X5ror58gOJAxPfFLAQhZJ6nOUeS4tfFwo=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "645ff62e09d294a30de823cb568e9c6d68e92606",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "nixos-unstable",
+ "type": "indirect"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..3f75ebc
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,39 @@
+{
+ description = "cool calculators";
+
+ inputs.nixpkgs.url = "nixpkgs/nixos-unstable";
+
+ outputs = {nixpkgs, ...}: let
+ systems = [
+ "x86_64-linux"
+ "aarch64-linux"
+ "x86_64-darwin"
+ "aarch64-darwin"
+ ];
+
+ forAllSystems = nixpkgs.lib.genAttrs systems;
+ nixpkgsFor = forAllSystems (system: import nixpkgs {inherit system;});
+
+ forEachSystem = fn:
+ forAllSystems (system:
+ fn {
+ inherit system;
+ pkgs = nixpkgsFor.${system};
+ });
+ in {
+ devShells = forEachSystem ({pkgs, ...}: {
+ default = pkgs.mkShell {
+ packages = with pkgs; [
+ ghc
+ haskellPackages.runghc
+ jdk17_headless
+ ldc
+ rustc
+ swift
+ ];
+ };
+ });
+
+ formatter = forEachSystem ({pkgs, ...}: pkgs.alejandra);
+ };
+}
diff --git a/src/Calculator.java b/src/Calculator.java
new file mode 100644
index 0000000..6f2cb94
--- /dev/null
+++ b/src/Calculator.java
@@ -0,0 +1,53 @@
+import java.util.Scanner;
+
+class InvalidOperatorException extends Exception {
+ public InvalidOperatorException(String errorMessage) {
+ super(errorMessage);
+ }
+}
+
+public class Calculator {
+ private static float calculate(String operator, float number1, float number2) throws InvalidOperatorException {
+ switch(operator) {
+ case "+":
+ return number1 + number2;
+ case "-":
+ return number1 - number2;
+ case "/":
+ return number1 / number2;
+ case "*":
+ return number1 * number2;
+ default:
+ throw new InvalidOperatorException("invalid operator used!");
+ }
+ }
+
+ public static void main(String[] args) {
+ Scanner scan = new Scanner(System.in);
+
+ float number1, number2, result;
+ String operator;
+
+ try {
+ System.out.print("enter a number: " );
+ number1 = scan.nextFloat();
+ System.out.print("enter an operator: ");
+ scan.nextLine();
+ operator = scan.nextLine();
+ System.out.print("enter another number: ");
+ number2 = scan.nextFloat();
+ } catch (Exception e) {
+ System.out.println("couldn't get your input!");
+ return;
+ }
+
+ try {
+ result = calculate(operator, number1, number2);
+ } catch (InvalidOperatorException e) {
+ System.out.println(e.getMessage());
+ return;
+ }
+
+ System.out.println(result);
+ }
+}
diff --git a/src/calculator.d b/src/calculator.d
new file mode 100644
index 0000000..c7933be
--- /dev/null
+++ b/src/calculator.d
@@ -0,0 +1,49 @@
+import std.stdio;
+import std.string;
+
+class InvalidOperatorException : Exception {
+ this(string msg, string file = __FILE__, size_t line = __LINE__) {
+ super(msg, file, line);
+ }
+}
+
+float calculate(char[] operator, float number1, float number2) {
+ foreach (c; operator) {
+ switch(c) {
+ case '+':
+ return number1 + number2;
+ case '-':
+ return number1 - number2;
+ case '/':
+ return number1 / number2;
+ case '*':
+ return number1 * number2;
+ default:
+ continue;
+ }
+ }
+ throw new InvalidOperatorException("invalid operator used!");
+}
+
+void main() {
+ char[] operator;
+ float number1;
+ float number2;
+ write("enter a number: ");
+ readf("%f", &number1);
+
+ write("enter an operator: ");
+ readf(" %s\n", &operator);
+
+ write("enter another number: ");
+ readf(" %f", &number2);
+
+ float result;
+ try {
+ result = calculate(operator, number1, number2);
+ } catch (InvalidOperatorException e) {
+ writeln(e);
+ }
+
+ writeln(result);
+}
diff --git a/src/calculator.hs b/src/calculator.hs
new file mode 100644
index 0000000..1da13af
--- /dev/null
+++ b/src/calculator.hs
@@ -0,0 +1,22 @@
+calculate :: String -> Float -> Float -> Float
+calculate operator number1 number2 = case operator of
+ "+" -> number1 + number2
+ "-" -> number1 - number2
+ "/" -> number1 / number2
+ "*" -> number1 * number2
+ _ -> error "invalid operator!"
+
+main :: IO()
+main = do
+ putStr "enter a number: "
+ input<-getLine
+ let number1 = (read input :: Float)
+
+ putStr "enter an operator: "
+ operator<-getLine
+
+ putStr "enter another number: "
+ input<-getLine
+ let number2 = (read input :: Float)
+
+ print (calculate operator number1 number2)
diff --git a/src/calculator.rs b/src/calculator.rs
new file mode 100644
index 0000000..eab3ac8
--- /dev/null
+++ b/src/calculator.rs
@@ -0,0 +1,58 @@
+use std::error::Error;
+use std::fmt;
+use std::io;
+use std::process;
+
+#[derive(Debug)]
+struct UnknownOperatorError;
+
+impl Error for UnknownOperatorError {}
+
+impl fmt::Display for UnknownOperatorError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "invalid operator!")
+ }
+}
+
+fn get_input() -> String {
+ let mut res = String::new();
+ io::stdin()
+ .read_line(&mut res)
+ .expect("failed to get input!");
+
+ return (*res).trim().to_string();
+}
+
+fn get_number() -> f32 {
+ get_input()
+ .parse::<f32>()
+ .expect("failed to get your number (possible lack of rizz)")
+}
+
+fn calculate(operator: &String, number1: &f32, number2: &f32) -> Result<f32, UnknownOperatorError> {
+ match operator.as_str() {
+ "+" => Ok(number1 + number2),
+ "-" => Ok(number1 - number2),
+ "/" => Ok(number1 / number2),
+ "*" => Ok(number1 * number2),
+ _ => Err(UnknownOperatorError),
+ }
+}
+
+fn main() {
+ println!("enter a number: ");
+ let number1 = get_number();
+ println!("enter an operator: ");
+ let operator = get_input();
+ println!("enter another number: ");
+ let number2 = get_number();
+
+ let res = calculate(&operator, &number1, &number2);
+ match res {
+ Ok(i) => println!("{i}"),
+ Err(e) => {
+ eprintln!("{e}");
+ process::exit(1);
+ }
+ }
+}
diff --git a/src/calculator.swift b/src/calculator.swift
new file mode 100644
index 0000000..dfd4c4c
--- /dev/null
+++ b/src/calculator.swift
@@ -0,0 +1,41 @@
+enum InvalidOperatorError: Error {
+ case operatorNotSupported
+}
+
+func calculate(operatorThing: String, number1: Float, number2: Float) throws -> Float {
+ switch operatorThing {
+ case "+":
+ return number1 + number2
+ case "-":
+ return number1 - number2
+ case "/":
+ return number1 / number2
+ case "*":
+ return number1 * number2
+ default:
+ throw InvalidOperatorError.operatorNotSupported
+ }
+}
+
+
+func main() {
+ print("enter a number:")
+ let number1 = Float(readLine()!)!
+ print("enter an operator:")
+ let operatorThing = readLine()!
+ print("enter another number:")
+ let number2 = Float(readLine()!)!
+
+ do {
+ let result = try calculate(operatorThing: operatorThing, number1: number1, number2: number2)
+ print(result)
+ } catch InvalidOperatorError.operatorNotSupported {
+ print("invalid operator!")
+ return
+ } catch {
+ print("unexpected error!")
+ return
+ }
+}
+
+main()