| 1 | #!/usr/bin/env bash
|
| 2 | #
|
| 3 | # Survey arithmetic in various languages
|
| 4 | #
|
| 5 | # Usage:
|
| 6 | # demo/survey-arith.sh <function name>
|
| 7 |
|
| 8 | set -o nounset
|
| 9 | set -o pipefail
|
| 10 | set -o errexit
|
| 11 |
|
| 12 | # TODO:
|
| 13 | # - Test invariants
|
| 14 | # - OSH follows shells/awk/C
|
| 15 | # - YSH could disallow negative numbers
|
| 16 |
|
| 17 | divmod() {
|
| 18 | echo 'Python'
|
| 19 | python3 -c 'print(10 / -3); print(- 10 / 3)'
|
| 20 | python3 -c 'print(10 // -3); print(- 10 // 3)'
|
| 21 | python3 -c 'print(10 % -3); print(- 10 % 3); print (-10 % -3)'
|
| 22 | python3 -c 'print(10.0 % -3.0); print(- 10.0 % 3.0); print (-10.0 % -3.0)'
|
| 23 | echo
|
| 24 |
|
| 25 | # Lua matches Python!
|
| 26 | echo 'Lua'
|
| 27 | lua -e 'print(10 / -3); print(- 10 / 3)'
|
| 28 | lua -e 'print(10 // -3); print(- 10 // 3)'
|
| 29 | lua -e 'print(10 % -3); print(- 10 % 3); print (-10 % -3)'
|
| 30 | lua -e 'print(10.0 % -3.0); print(- 10.0 % 3.0); print (-10.0 % -3.0)'
|
| 31 | echo
|
| 32 |
|
| 33 | # JS and Awk match
|
| 34 | echo 'JS'
|
| 35 | nodejs -e 'console.log(10 / -3); console.log(- 10 / 3)'
|
| 36 | nodejs -e 'console.log(10 % -3); console.log(- 10 % 3); console.log(-10 % -3);'
|
| 37 | # no difference
|
| 38 | #nodejs -e 'console.log(10.0 % -3.0); console.log(- 10.0 % 3.0); console.log(-10.0 % -3.0);'
|
| 39 | echo
|
| 40 |
|
| 41 | echo 'Perl'
|
| 42 | perl -e 'print 10 / -3 . "\n"; print - 10 / 3 . "\n"'
|
| 43 | # Perl modulus doesn't match Python/Lua or Awk/shell!
|
| 44 | perl -e 'print 10 % -3 . "\n"; print - 10 % 3 . "\n"; print -10 % -3 . "\n"'
|
| 45 | perl -e 'print 10.0 % -3.0 . "\n"; print - 10.0 % 3.0 . "\n"; print -10.0 % -3.0 . "\n"'
|
| 46 | echo
|
| 47 |
|
| 48 | echo 'Awk'
|
| 49 | awk 'END { print(10 / -3); print (- 10 / 3) }' < /dev/null
|
| 50 | awk 'END { print(10 % -3); print (- 10 % 3); print(-10 % -3) }' < /dev/null
|
| 51 | echo
|
| 52 |
|
| 53 | # bash only has integegers
|
| 54 | for sh in bash dash zsh; do
|
| 55 | echo $sh
|
| 56 | $sh -c 'echo $((10 / -3)); echo $((- 10 / 3))'
|
| 57 | $sh -c 'echo $((10 % -3)); echo $((- 10 % 3)); echo $((-10 % -3))'
|
| 58 | echo
|
| 59 | done
|
| 60 | }
|
| 61 |
|
| 62 | # TODO:
|
| 63 | # - Add Julia, Erlang, Elixir
|
| 64 |
|
| 65 | bigint() {
|
| 66 | # Bigger than 2**64
|
| 67 | local big=11112222333344445555666677778888999
|
| 68 |
|
| 69 | # Big Int
|
| 70 | echo 'python3'
|
| 71 | python3 -c "print($big)"
|
| 72 | echo
|
| 73 |
|
| 74 | # Gets printed in scientific notation
|
| 75 | echo 'node.js'
|
| 76 | nodejs -e "console.log($big)"
|
| 77 | echo
|
| 78 |
|
| 79 | # Ditto, scientific
|
| 80 | echo 'Lua'
|
| 81 | lua -e "print($big)"
|
| 82 | echo
|
| 83 |
|
| 84 | # Scientific
|
| 85 | echo Perl
|
| 86 | perl -e "print $big"; echo
|
| 87 | echo
|
| 88 |
|
| 89 | # Awk loses precision somehow, not sure what they're doing
|
| 90 | echo awk
|
| 91 | awk -e "END { print $big }" < /dev/null
|
| 92 | echo
|
| 93 |
|
| 94 | local osh=_bin/cxx-dbg/osh
|
| 95 | ninja $osh
|
| 96 |
|
| 97 | for sh in dash bash mksh zsh $osh; do
|
| 98 | echo $sh
|
| 99 | $sh -c "echo \$(( $big ))" || true
|
| 100 | echo
|
| 101 | done
|
| 102 |
|
| 103 | # Julia has big integers
|
| 104 | echo 'Julia'
|
| 105 | demo/julia.sh julia -e "print($big)"; echo
|
| 106 | echo
|
| 107 |
|
| 108 | # None of the interpreters reject invalid input! They tend to mangle the
|
| 109 | # numbers.
|
| 110 | }
|
| 111 |
|
| 112 | "$@"
|