More fun with scripts/play.fun. No core code logic changes. (0.41.5)
This commit is contained in:
parent
d96976c6a9
commit
8e895dafcc
3 changed files with 101 additions and 5 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
project(fun VERSION 0.41.4 LANGUAGES C)
|
project(fun VERSION 0.41.5 LANGUAGES C)
|
||||||
|
|
||||||
set(CMAKE_C_STANDARD 99)
|
set(CMAKE_C_STANDARD 99)
|
||||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
|
|
||||||
39
scripts/play
Executable file
39
scripts/play
Executable file
|
|
@ -0,0 +1,39 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Wrapper to run scripts/play.fun without requiring 'fun' on PATH.
|
||||||
|
# Honors FUN_BIN if provided, otherwise auto-detects a local build, then PATH.
|
||||||
|
|
||||||
|
ROOT="$(cd "$(dirname "$0")"/.. && pwd)"
|
||||||
|
PLAY_FUN="$ROOT/scripts/play.fun"
|
||||||
|
|
||||||
|
BIN="${FUN_BIN:-}"
|
||||||
|
if [[ -z "$BIN" ]]; then
|
||||||
|
# Try common local build locations
|
||||||
|
for cand in \
|
||||||
|
"$ROOT/build/fun" \
|
||||||
|
"$ROOT/build_debug/fun" \
|
||||||
|
"$ROOT/build_release/fun" \
|
||||||
|
"$ROOT/fun"; do
|
||||||
|
if [[ -x "$cand" ]]; then
|
||||||
|
BIN="$cand"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$BIN" ]]; then
|
||||||
|
if command -v fun >/dev/null 2>&1; then
|
||||||
|
BIN="fun"
|
||||||
|
else
|
||||||
|
echo "error: fun interpreter not found. Set FUN_BIN or build it (e.g., CMake)." >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure stdlib is discoverable unless user overrides
|
||||||
|
if [[ -z "${FUN_LIB_DIR:-}" ]]; then
|
||||||
|
export FUN_LIB_DIR="$ROOT/lib"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "$BIN" "$PLAY_FUN" "$@"
|
||||||
|
|
@ -18,6 +18,46 @@
|
||||||
#include <cli.fun>
|
#include <cli.fun>
|
||||||
#include <strings.fun>
|
#include <strings.fun>
|
||||||
|
|
||||||
|
// Early argv scan so --help exits before any other side effects
|
||||||
|
raw_argv = argv()
|
||||||
|
yes_all = 0
|
||||||
|
no_all = 0
|
||||||
|
want_help = 0
|
||||||
|
idx = 0
|
||||||
|
argc = len(raw_argv)
|
||||||
|
while (idx < argc)
|
||||||
|
tok = raw_argv[idx]
|
||||||
|
if (tok == "--yes")
|
||||||
|
yes_all = 1
|
||||||
|
else if (tok == "--no")
|
||||||
|
no_all = 1
|
||||||
|
else if (tok == "--help")
|
||||||
|
want_help = 1
|
||||||
|
idx = idx + 1
|
||||||
|
|
||||||
|
if (want_help == 1)
|
||||||
|
print("Usage: scripts/play.fun [--yes | --no] [examples-subdir]")
|
||||||
|
print("")
|
||||||
|
print("Options:")
|
||||||
|
print(" --yes Run all listed examples without asking")
|
||||||
|
print(" --no Do not run any examples (show list only)")
|
||||||
|
print(" --help Show this help and exit")
|
||||||
|
print("")
|
||||||
|
print("Behavior:")
|
||||||
|
print(" - Without a subdirectory argument: only runs .fun files directly in ./examples/")
|
||||||
|
print(" - With an examples-subdir: searches recursively under ./examples/<subdir>/")
|
||||||
|
print("")
|
||||||
|
print("Environment:")
|
||||||
|
print(" FUN_BIN Path to the fun interpreter (overrides auto-detection)")
|
||||||
|
print(" FUN_LIB_DIR Path to stdlib (defaults to ./lib)")
|
||||||
|
print("")
|
||||||
|
print("Examples:")
|
||||||
|
print(" scripts/play.fun")
|
||||||
|
print(" scripts/play.fun --yes")
|
||||||
|
print(" scripts/play.fun crypto")
|
||||||
|
print(" scripts/play.fun --no math")
|
||||||
|
exit(0)
|
||||||
|
|
||||||
// Set FUN_LIB_DIR to ensure stdlib is found
|
// Set FUN_LIB_DIR to ensure stdlib is found
|
||||||
// We try to use existing environment or default to ./lib
|
// We try to use existing environment or default to ./lib
|
||||||
lib_dir = env("FUN_LIB_DIR")
|
lib_dir = env("FUN_LIB_DIR")
|
||||||
|
|
@ -93,11 +133,15 @@ fun get_examples(subdir)
|
||||||
i = i + 1
|
i = i + 1
|
||||||
return examples
|
return examples
|
||||||
|
|
||||||
args = parse_args(argv())
|
args = parse_args(raw_argv)
|
||||||
subdir = ""
|
subdir = ""
|
||||||
if (len(args["positionals"]) > 0)
|
if (len(args["positionals"]) > 0)
|
||||||
subdir = args["positionals"][0]
|
subdir = args["positionals"][0]
|
||||||
|
|
||||||
|
if (yes_all == 1 && no_all == 1)
|
||||||
|
print("Error: --yes and --no cannot be used together.")
|
||||||
|
exit(2)
|
||||||
|
|
||||||
examples = get_examples(subdir)
|
examples = get_examples(subdir)
|
||||||
if (len(examples) == 0)
|
if (len(examples) == 0)
|
||||||
if (len(subdir) > 0)
|
if (len(subdir) > 0)
|
||||||
|
|
@ -117,9 +161,22 @@ while (i < n)
|
||||||
print("Example: " + example)
|
print("Example: " + example)
|
||||||
|
|
||||||
// ask_yes_no returns 1 for yes, 0 for no
|
// ask_yes_no returns 1 for yes, 0 for no
|
||||||
print("Do you want to run this example? [y/N]")
|
run_it = 0
|
||||||
ans = str_to_lower(str_trim(input("")))
|
if (yes_all == 1)
|
||||||
if (ans == "y" || ans == "yes")
|
// Auto-approve running
|
||||||
|
run_it = 1
|
||||||
|
else if (no_all == 1)
|
||||||
|
// Auto-decline
|
||||||
|
run_it = 0
|
||||||
|
else
|
||||||
|
print("Do you want to run this example? [y/N]")
|
||||||
|
ans = str_to_lower(str_trim(input("")))
|
||||||
|
if (ans == "y" || ans == "yes")
|
||||||
|
run_it = 1
|
||||||
|
else
|
||||||
|
run_it = 0
|
||||||
|
|
||||||
|
if (run_it == 1)
|
||||||
print("Running: " + interpreter + " " + example)
|
print("Running: " + interpreter + " " + example)
|
||||||
|
|
||||||
// Prepare command with environment variable
|
// Prepare command with environment variable
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue