From 8fcde466805466c7ecebfc3cd7d4340117a29576 Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Sat, 7 Mar 2026 17:18:58 +0100 Subject: functions!! --- src/run/mod.rs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'src/run/mod.rs') diff --git a/src/run/mod.rs b/src/run/mod.rs index f767434..0b9aef8 100644 --- a/src/run/mod.rs +++ b/src/run/mod.rs @@ -8,6 +8,7 @@ use crate::*; mod builtin; +#[derive(Debug)] enum ExecError { UnknownVariable(BString), ExecError(i32), @@ -16,6 +17,7 @@ enum ExecError { #[derive(Clone)] struct Executor { se: Arc>, + args: Option>, } impl Executor { @@ -121,8 +123,16 @@ impl Executor { threads.push(handle); } - CommandKind::Fun(_ast) => { - todo!() + CommandKind::Fun(ast) => { + let mut this = self.clone(); + + let mut args = Vec::with_capacity(cmd.args.len() + 1); + args.push(cmd.cmd.clone()); + args.extend_from_slice(&cmd.args); + this.args = Some(args); + + let ast = ast.expand(&mut this)?; + this.execute(ast, prev_reader, writer).unwrap(); } } @@ -206,9 +216,12 @@ impl parse::Expander for Executor { .ok() .and_then(|x| x.parse::().ok()) { - match std::env::args_os().skip(x).next() { - Some(arg) => return Ok(arg.into_encoded_bytes()), - None => (), + if let Some(args) = &self.args { + if x < args.len() { + return Ok(args[x].clone()); + } + } else if let Some(arg) = std::env::args_os().skip(x).next() { + return Ok(arg.into_encoded_bytes()); } } } @@ -239,7 +252,7 @@ impl parse::Expander for Executor { } fn exec(se: Arc>, ast: Ast) -> Result<(), ExecError> { - let mut exec = Executor { se }; + let mut exec = Executor { se, args: None }; let ast = ast.expand(&mut exec)?; exec.execute(ast, None, None) } -- cgit v1.2.3