1 ## our_shell: ysh
2 ## oils_failures_allowed: 3
3
4 #### JSON func on top of proc
5
6 proc myadd {
7 json read :args
8
9 # convenient!
10 fopen >&2 {
11 = args
12 }
13
14 json write (args[0] + args[1])
15 }
16
17 echo '[1, 2]' | myadd | json read :result
18
19 # TODO:
20 # Rewrite this as:
21 #
22 # var result = myadd(1,2)
23 #
24 # Is that possible? I think functions can live in their own namespace?
25 # Or you can have expr.Func() with all the metadata?
26 # Problem with 'source mytool.hay' is that it can define funcs ANYWHERE
27 # you might need a namespace like extern::mytool::myfunc()
28
29 echo "result = $result"
30
31 ## STDOUT:
32 TODO
33 result = 3
34 ## END
35
36 #### QTT func on top of proc
37
38 proc myadd {
39
40 # I thought this was 'wok'
41 qtt read-rows {
42 if (_index === 0) {
43 # could write header first here
44 write --sep $TAB -- $_schema_str 'result:Int'
45
46 # _schema is the raw schema
47 }
48 # or use BEGIN and 'when', like awk-style
49
50 const result = _row->x + _row->y
51 write --sep $TAB -- $_row_str $result
52 }
53 }
54
55 qtt tabify '''
56 x:Int y:Int
57 1 2
58 3 4
59 ''' | myadd | qtt read-cols result
60
61 echo "result = $result"
62
63 ## STDOUT:
64 ## END
65
66 #### QTT func on top of wok
67
68 wok foo {
69 BEGIN {
70 write --sep $TAB -- $_schema_str' result:Int'
71 }
72
73 # for all rows. Could be 'each' or 'row'
74 when {
75 const result = _row->x + _row->y
76 write --sep $TAB -- $_row_str $result
77 }
78 }
79
80 ## STDOUT:
81 ## END
82
83
84 # Notes:
85 # - consider JSON-RPC
86 # - consider multiple return values