| 1 | ---
 | 
| 2 | default_highlighter: oils-sh
 | 
| 3 | ---
 | 
| 4 | 
 | 
| 5 | Novelties in OSH and YSH
 | 
| 6 | ========================
 | 
| 7 | 
 | 
| 8 | Oils usually cleans up existing practice, rather than inventing brand new
 | 
| 9 | things.  But here are a few features that may be unfamiliar.
 | 
| 10 | 
 | 
| 11 | Related: [Known Differences](known-differences.html).
 | 
| 12 | 
 | 
| 13 | <div id="toc">
 | 
| 14 | </div>
 | 
| 15 | 
 | 
| 16 | ## Global Options in the Interpreter
 | 
| 17 | 
 | 
| 18 | The interpreter has a big list of global settings!  Print them with `shopt -p`.
 | 
| 19 | 
 | 
| 20 | This idea comes from shell, and they can be tamed with blocks to `shopt`:
 | 
| 21 | 
 | 
| 22 |     shopt --unset errexit {
 | 
| 23 |       touch /let
 | 
| 24 |       touch /it
 | 
| 25 |       touch /fail
 | 
| 26 |     }
 | 
| 27 | 
 | 
| 28 | We use options to upgrade OSH to YSH:
 | 
| 29 | 
 | 
| 30 |     shopt --set ysh:upgrade
 | 
| 31 | 
 | 
| 32 | 
 | 
| 33 | It's a bit like `use strict;` in Perl and JavaScript, or `from __future__` in
 | 
| 34 | Python.
 | 
| 35 | 
 | 
| 36 | 
 | 
| 37 | ## The First Word of a Command
 | 
| 38 | 
 | 
| 39 | The Python-like features in YSH have to co-exist with shell like `echo "hello
 | 
| 40 | $name"`, so there are more "first words".
 | 
| 41 | 
 | 
| 42 | ### Mutation Uses the `setvar` Keyword
 | 
| 43 | 
 | 
| 44 | In YSH, mutation looks like this:
 | 
| 45 | 
 | 
| 46 |     setvar x = 42
 | 
| 47 |     setvar x += 3
 | 
| 48 | 
 | 
| 49 | Not like JavaScript or Python
 | 
| 50 | 
 | 
| 51 |     x = 42  # doesn't work
 | 
| 52 |     x += 3  # nope
 | 
| 53 | 
 | 
| 54 | ### Evaluate Expressions with the `call` and `=` Keywords
 | 
| 55 | 
 | 
| 56 | In YSH, you use the `call` keyword to throw away the result of an expression.
 | 
| 57 | It's most often used with functions and methods:
 | 
| 58 | 
 | 
| 59 |     call myFunc(x)
 | 
| 60 | 
 | 
| 61 |     call mylist->pop()
 | 
| 62 | 
 | 
| 63 | The `=` operator works the same way, but prints the return value:
 | 
| 64 | 
 | 
| 65 |     $ = mylist->pop()  # pretty-print result with = operator
 | 
| 66 |     (Str)    "x"
 | 
| 67 | 
 | 
| 68 |     $ = 42 + a[i]
 | 
| 69 |     (Int)    43
 | 
| 70 | 
 | 
| 71 | See [Command vs. Expression Mode](command-vs-expression-mode.html) for more.
 | 
| 72 | 
 | 
| 73 | ### Hay Case Sensitivity
 | 
| 74 | 
 | 
| 75 | Attribute nodes start with capital letters, and this changes the parsing mode
 | 
| 76 | to allow "bare" assignment:
 | 
| 77 | 
 | 
| 78 |     hay define Package
 | 
| 79 |  
 | 
| 80 |     Package {
 | 
| 81 |       name = 'cpython'  # assignment without var/setvar keyword
 | 
| 82 |       version = '3.12'
 | 
| 83 |     }
 | 
| 84 | 
 | 
| 85 | ## Lazy Arg Lists
 | 
| 86 | 
 | 
| 87 | These use `[]` instead of `()`:
 | 
| 88 | 
 | 
| 89 |     assert [42 === x]  # assert can pretty-print the expression
 | 
| 90 | 
 | 
| 91 |     ls8 | where [size > 10]  # not implemented
 | 
| 92 | 
 | 
| 93 | It's motivated by idioms from Awk and R.
 | 
| 94 | 
 | 
| 95 | ## Three Quotation Types
 | 
| 96 | 
 | 
| 97 | YSH is Lisp-y!  These **unevaluated** quotation types don't appear in Python
 | 
| 98 | and JS:
 | 
| 99 | 
 | 
| 100 |     var myblock = ^(ls /tmp | wc -l)  
 | 
| 101 | 
 | 
| 102 |     var myexpr = ^[age > 10]  # use evalExpr()
 | 
| 103 | 
 | 
| 104 |     var mytemplate = ^"$name is $age years old"  # not implemented
 | 
| 105 | 
 | 
| 106 | 
 | 
| 107 | TODO: Explain more.
 | 
| 108 | 
 | 
| 109 | 
 | 
| 110 | 
 | 
| 111 | <!--
 | 
| 112 | 
 | 
| 113 | Other: value.Place could be unfamliar to Python/JS users.  It's based on C/C++
 | 
| 114 | (but safe), and Rust also uses a similar syntax.
 | 
| 115 | 
 | 
| 116 | -->
 | 
| 117 | 
 | 
| 118 | ## Related 
 | 
| 119 | 
 | 
| 120 | - [Quirks](quirks.html) is about OSH.
 | 
| 121 | - [Warts](warts.html) is about YSH.
 | 
| 122 | 
 |