wisp
 
(Arne Babenhauserheide)
2013-04-12: can run arbitrary wisp files and add interactive input before

can run arbitrary wisp files and add interactive input before execution.

diff --git a/wisp-multiline.sh b/wisp-multiline.sh
--- a/wisp-multiline.sh
+++ b/wisp-multiline.sh
@@ -25,14 +25,14 @@ version="wisp multiline 0.1"
 getopt -T > /dev/null
 if [ $? -eq 4 ]; then
     # GNU enhanced getopt is available
-    eval set -- `getopt --long help,lisp:,verbose,version,output: --options hl:vo: -- "$@"`
+    eval set -- `getopt --long help,lisp:,verbose,version,output:,interactive --options hl:vo:i -- "$@"`
 else
     # Original getopt is available
-    eval set -- `getopt hl:vo: "$@"`
+    eval set -- `getopt hl:vo:i "$@"`
 fi
 
 PROGNAME=`basename $0`
-ARGS=`getopt --name "$PN" --long help,lisp:,verbose,version,output: --options hl:vo: -- "$@"`
+ARGS=`getopt --name "$PN" --long help,lisp:,verbose,version,output:,interactive --options hl:vo:i -- "$@"`
 if [ $? -ne 0 ]; then
   exit 1
 fi
@@ -44,37 +44,35 @@ LISP=guile
 verbose=no
 VERSION=no
 OUTPUT=no
+INTERACTIVE=no
+wisp=""
+lispcode=""
 
 while [ $# -gt 0 ]; do
     case "$1" in
-        -h | --help)     HELP=yes;;
-        -l | --lisp)     LISP="$2"; shift;;
-        -o | --output)   OUTPUT="$2"; shift;;
-        -v | --verbose)  VERBOSE=yes;;
-        --version)       VERSION=yes;;
+        -h | --help)        HELP=yes;;
+        -l | --lisp)        LISP="$2"; shift;;
+        -o | --output)      OUTPUT="$2"; shift;;
+        -v | --verbose)     VERBOSE=yes;;
+        -i | --interactive) INTERACTIVE=yes;;
+        --version)          VERSION=yes;;
         --)              shift; break;;
     esac
     shift
 done
 
-if [ $# -gt 0 ]; then
-  # Remaining parameters can be processed
-  for ARG in "$@"; do
-    echo "$PROGNAME: argument: $ARG"
-  done
-fi
-
 # Provide help output
 
 if [[ $HELP == "yes" ]]; then
-    echo "$0 [-h] [-l] [-v]
-        Run multiline commands through wisp.
+    echo "$0 [-h] [-l] [-v] [-i] [SCRIPT ...]
+        Run multiline commands through wisp or execute the SCRIPT.
         
-        -h | --help)     This help output.
-        -l | --lisp)     Select the Lisp interpreter to call. Options: guile
-        -o | --output)   Save the executed wisp code to this file.
-        -v | --verbose)  Provide verbose output.
-        --version)       Print the version string of this script.
+        -h | --help)        This help output.
+        -l | --lisp)        Select the Lisp interpreter to call. Options: guile
+        -o | --output)      Save the executed wisp code to this file.
+        -v | --verbose)     Provide verbose output.
+        -i | --interactive) Run interactive commands after reading scripts.
+        --version)          Print the version string of this script.
 "
     exit 0
 fi
@@ -89,17 +87,49 @@ fi
 if [[ $LISP != "guile" ]]; then
     echo "Interpreter $LISP not known."
     exit 1
+else
+    INTERPRETER="guile -s /dev/stdin"
 fi
 
-# Run the code
+# if a script is given, execute that.
+
+if [ $# -gt 0 ]; then
+  # Remaining parameters can be processed
+  for ARG in "$@"; do
+      l=$(./wisp.py "${ARG}")
+      lispcode="${lispcode}
+${l}"
+  done
+  if [[ x"$INTERACTIVE" == x"no" ]]; then
+      echo "${lispcode}" | ${INTERPRETER}
+      exit 0
+  fi
+fi
+
+# Read the code
 
 echo ";; Welcome to wisp. Please enter your code. 
 ;; Finish with two linebreaks, then execute with CTRL-D."
 
-# if the user requests output, copy the pipe with tee
+while IFS= read wispi ; do 
+    wisp="${wisp}
+${wispi}" 
+done 
+
+# if the user requests output, copy the pipe with tee and append it to
+# the output
 
 if [[ x"$OUTPUT" != x"no" ]]; then
-    while IFS= read wisp ; do echo "$wisp" ; done | tee -a $OUTPUT | ./wisp.py - | guile -s /dev/stdin
-else
-    while IFS= read wisp ; do echo "$wisp" ; done |  ./wisp.py - | guile -s /dev/stdin
+    echo "${wisp}" >> $OUTPUT
 fi
+
+# convert the input to lisp
+
+l=$(echo "${wisp}" |  ./wisp.py - )
+lispcode="${lispcode}
+${l}"
+
+# now run the code
+
+echo "${lispcode}" | guile -s /dev/stdin
+