This looks really, really good. I’ve been looking for something like this for a while, even considered building it myself. Javascript and Shell programs are actually pretty similar IMO. Both are loosely functional languages that can run in many different environments, with different feature sets in each. Both run from a single entry point. A lot of JS tooling could be applied to Shell scripting. This library takes th…
Modernish: a shell moderniser library
11–16 of 16 posts
Re: Modernish: a shell moderniser library
#12This looks really, really good. I’ve been looking for something like this for a while, even considered building it myself. Javascript and Shell programs are actually pretty similar IMO. Both are loosely functional languages that can run in many different environments, with different feature sets in each. Both run from a single entry point. A lot of JS tooling could be applied to Shell scripting. This library takes th…
Shell is so much not functional. Most shells don't even have proper functions. And while pipes resemble function composition to some extent, you have side-effects and mutations everywhere.
For both languages you can write code as functional or non functional as you want. Input/output redirection (pipes), IMO, could qualify as functional programming just as JS promise chaining could.
Re: Modernish: a shell moderniser library
#13For example have a look at the definition of `sfor`
sfor 'i=1' '[ "$i" -le 10 ]' 'i=$((i+1))'; do
print "$i"
done
Doesn't look too bad at first, until you realize `sfor` is an alias which is defined as alias sfor='_Msh_sfor_init=y && while _Msh_doSfor'
So it's an alias which expands to two commands.No have a look at the definition of `_Msh_doSfor`
_Msh_doSfor() {
case ${#},${_Msh_sfor_init+y} in
( 3, ) eval " $3" || die 'sfor: loop command failed' || return ;;
( 3,y ) eval " $1" || die 'sfor: init command failed' || return
unset -v _Msh_sfor_init ;;
( * ) die "sfor: 3 arguments expected, got $#" || return ;;
esac
eval " $2" || case $? in
( 1 ) return 1 ;;
( * ) die "sfor: test command failed" ;;
esac
}
No thanks, I'd rather use Python.Re: Modernish: a shell moderniser library
#14This looks really, really good. I’ve been looking for something like this for a while, even considered building it myself. Javascript and Shell programs are actually pretty similar IMO. Both are loosely functional languages that can run in many different environments, with different feature sets in each. Both run from a single entry point. A lot of JS tooling could be applied to Shell scripting. This library takes th…
Shell is so much not functional. Most shells don't even have proper functions. And while pipes resemble function composition to some extent, you have side-effects and mutations everywhere.
Pipelines Support Vectorized, Point-Free, and Imperative Style
http://www.oilshell.org/blog/2017/01/15.html
In a sense, a shell can only return an exit code. But it's better to think of that as an error handling mechanism rather than the return value, much like in C. In C, it's idiomatic for functions to return values with "out params" (i.e. a dynamically allocated a string).
Just like you can write C code that composes, you can also write shell code that composes. And in many ways it composes better than code in other languages.
Re: Modernish: a shell moderniser library
#15While I applaud the effort and extensive documentation I'd never use something like this in production. For example have a look at the definition of `sfor` sfor 'i=1' '[ "$i" -le 10 ]' 'i=$((i+1))'; do print "$i" done Doesn't look too bad at first, until you realize `sfor` is an alias which is defined as alias sfor='_Msh_sfor_init=y && while _Msh_doSfor' So it's an alias which expands to two commands. No have a look…
Re: Modernish: a shell moderniser library
#16Looks amazing. Note "use safe" in the README is missing some words: > "Does IFS=''; set -f -u -C, that is: field splitting and globbing are disabled, variables must be defined before use, and"