Last active
May 7, 2020 04:00
-
-
Save youz/7a63095fea2ae5ed7b6cd526d51cdd4b to your computer and use it in GitHub Desktop.
Grass on Grass on SATySFi
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| % grass.saty - Grass interpreter | |
| % https://github.com/youz/grasses | |
| % | |
| % Copyright (C) 2018-2020 Yousuke Ushiki <[email protected]> | |
| % All rights reserved. | |
| % | |
| % Grass language | |
| % http://www.blue.sky.or.jp/grass/ | |
| % | |
| % Redistribution and use in source and binary forms, with or without | |
| % modification, are permitted provided that the following conditions | |
| % are met: | |
| % 1. Redistributions of source code must retain the above copyright | |
| % notice, this list of conditions and the following disclaimer. | |
| % 2. Redistributions in binary form must reproduce the above copyright | |
| % notice, this list of conditions and the following disclaimer in | |
| % the documentation and/or other materials provided with the | |
| % distribution. | |
| % | |
| % THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' | |
| % AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | |
| % THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| % PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS | |
| % BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| % CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| % SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | |
| % BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | |
| % WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | |
| % OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | |
| % IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| @require: list | |
| module Grass : sig | |
| val run : string -> string -> (string * string) | |
| end | |
| = struct | |
| type insn = | |
| | App of int * int | |
| | Abs of insn list | |
| type value = | |
| | Primitive of (value -> value) * string | |
| | CharFn of int | |
| | Fn of insn list * value list | |
| | Error of string | |
| let-rec string-join | |
| | _ [] = ` ` | |
| | sep (x :: xs) = List.fold-left (fun a s -> a ^ sep ^ s) x xs | |
| let-rec i2s | |
| | (App (m, n)) = `App(` ^ (arabic m) ^ `,` ^ (arabic n) ^ `)` | |
| | (Abs code) = `Abs(` ^ (string-join `,` (List.map i2s code)) ^ `)` | |
| let-rec v2s | |
| | (Primitive (_, d)) = `Primitive(` ^ d ^ `)` | |
| | (CharFn c) = `Char(` ^ (arabic c) ^ `)` | |
| | (Fn (code, env)) = `Fn([` ^ (string-join `,` (List.map i2s code)) ^ `], [` | |
| ^ (string-join `,` (List.map v2s env)) ^ `])` | |
| | (Error msg) = `Error(` ^ msg ^ `)` | |
| % let ctrue = Fn([Abs([App(3, 2)])], [Fn([], [])]) | |
| % let cfalse = Fn([Abs([])], []) | |
| let ctrue = Primitive(fun x -> Primitive(fun y -> x, `x`), `true`) | |
| let cfalse = Primitive(fun x -> Primitive(fun y -> y, `y`), `false`) | |
| let-rec charcmp | |
| | (CharFn c) (CharFn d) = if c == d then ctrue else cfalse | |
| | _ _ = cfalse | |
| let succ = Primitive(fun x -> ( | |
| match x with | |
| | CharFn(c) -> CharFn((c + 1) mod 256) | |
| | _ -> Error(`on succ: not a char (` ^ (v2s x) ^ `)`) | |
| ), `Succ`) | |
| let-mutable stdout-buf <- [] | |
| let-mutable stdin-buf <- [] | |
| let write = Primitive(fun x -> ( | |
| match x with | |
| | CharFn(c) -> let () = stdout-buf <- c :: !stdout-buf in x | |
| | _ -> Error(`on write: not a char (` ^ (v2s x) ^ `)`) | |
| ), `Write`) | |
| let read = Primitive(fun eof -> ( | |
| match !stdin-buf with | |
| | [] -> eof | |
| | c :: r -> let () = stdin-buf <- r in CharFn c | |
| ), `In`) | |
| let-rec nth | |
| | _ [] = Error(`out of bounds`) | |
| | 0 (x :: xs) = x | |
| | n (x :: xs) = nth (n - 1) xs | |
| let-rec eval | |
| | [] (v :: r) = v | |
| | (i :: r) env = ( | |
| match i with | |
| | Abs(c) -> eval r (Fn(c, env) :: env) | |
| | App(m, n) -> ( | |
| let f = nth (m - 1) env in | |
| let x = nth (n - 1) env in | |
| let v = | |
| match f with | |
| | Primitive(f,_) -> f x | |
| | CharFn(c) -> charcmp f x | |
| | Fn(code, env) -> eval code (x :: env) | |
| in | |
| match v with | |
| | Error(_) -> v | |
| | _ -> eval r (v :: env) | |
| )) | |
| | _ _ = Error(`illegal state`) | |
| let findchar str chr start = | |
| let l = string-length str in | |
| let-rec f i = | |
| if i == l then -1 | |
| else if string-same chr (string-sub str i 1) then i | |
| else f (i + 1) | |
| in | |
| f start | |
| let split sep str = | |
| List.map (fun (i, s) -> s) (split-on-regexp (regexp-of-string sep) str) | |
| let regexp-del pattern str = | |
| string-join ` ` (split pattern str) | |
| let parse src = | |
| let-rec makeabs | |
| | 1 body = Abs(body) | |
| | arity body = makeabs (arity - 1) [Abs(body)] in | |
| let-rec parseapps | |
| | ` ` = [] | |
| | s = | |
| let l = string-length s in | |
| let m = findchar s `w` 0 in | |
| let n = findchar s `W` m in | |
| if n == -1 then [App(m, l - m)] | |
| else App(m, n - m) :: parseapps (string-sub s n (l - n)) | |
| in | |
| let parse1 s = | |
| let a = findchar s `W` 0 in | |
| if a == -1 then [makeabs (string-length s) []] | |
| else if a == 0 then parseapps s | |
| else [makeabs a (parseapps (string-sub s a ((string-length s) - a)))] | |
| in | |
| src |> regexp-del `[^WwVv]+` | |
| |> regexp-del `^W+` | |
| |> split `[Vv]+` | |
| |> List.fold-left (fun acc s -> List.append acc (parse1 s)) [] | |
| let get-stdout _ = | |
| string-unexplode (List.reverse (!stdout-buf)) | |
| let get-stderr v = | |
| match v with | |
| | Error(msg) -> msg | |
| | _ -> ` ` | |
| let run src stdin = | |
| match parse src with | |
| | [] -> (` `, `parse error`) | |
| | code -> ( | |
| let () = stdin-buf <- string-explode stdin in | |
| let v = eval (List.append code [App(1,1)]) [write; succ; CharFn(119); read] | |
| in | |
| (get-stdout (), get-stderr v) | |
| ) | |
| end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @require: stdja | |
| @import: grass | |
| let-block ctx +Grass src stdin = | |
| let (out, err) = Grass.run src stdin in | |
| let log str = display-message (`#` ^ str) in | |
| let () = log (`stdout:` ^ out) in | |
| let () = log (`error:` ^ err) in | |
| read-inline ctx (embed-string out) ++ inline-fil | |
| |> form-paragraph ctx | |
| % Grass interpreter written in Grass https://github.com/youz/Grass_on_Grass | |
| let grass-grass = `wvWWWWwwwwvwWwwvwwvwWwwvwwwWwwwWwwwvWWWWWWWWwwwwwwwwwvwWWWWWWwWwwwwwwwwwwwwvwwWWWWWwwwwwwwwwwwwwWWWWWWwwwWwwwWWWwvwWWWWWWwWWWWWWWWWwvwWWWWWWWwWWWWWWWWwvwwwWWWwwWwwWWWWwvwWWWWWWWWWwWWWWWWWWWWWWwvwWWWWWWWWWWwWWWWWWWWWWWwvwwWWWWwwWWWWWWwWWWWWWWWWWWWWwwwWWWWWWwwwwwWWwWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWwwwwwWwwwWWWwvWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWwvwWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwWwwvwWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWwWWWWwvwWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWwWWWWWwvwwwvwWWWWWWWWWWWWWWWWWWWWWWWWWWwwWwWWWWWWWwwWWwWwwwwwvwWWWWWWWWWWWWWWWWWWwwwwwwwwWwwvwWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWwwwwwwwWWWWwwwwwwwWWWWWwwwwwwWWWWWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWWWWWWWwwwwWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWwWWWWWwWWWWWWWwvwwWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWwwwWwwwWWWwvwWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWwvwWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWwvwwWWwvwwWWwWWWwvwwvWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWwwWwwwWWWwvwWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwWwwwwwwwwwwWWWwWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwWwwWWWWWWWWWWWWWWWWWwwwwwwwWwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWwwwWwwvWwwvwWWWWWWWWWWWWWWWWWWWWWWWwWwwWWWWWWWWWWWWWWWwWwwwwwwwwwwwvWwwwwvwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWwWwwwwwwwwWwwwwwwwvwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWwwvwwwWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWWwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwWwwwwwwwWWWwWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwvwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwvwwwWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwWWWWWwWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWwwwwwwwwwwWwwwwwwWWWwWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWwwwwwwwwwWWwWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwWWwWWWWWWwWwwwwwwwwwwwvwwWWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWwwwwwWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwWwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwWwwwwwwwwwwwwWWWwvwwvwWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwWWWWWWWwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwWwwWwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwWwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwWWwWWWWWWWWWWWwvwwWWwWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwvwwWWwWWWwvwwWWWwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWwWWWWWWwwwwWwwWWwWwwwwwwwwvwvWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWwWwwwwwwWWwwwwwwWWWWWWwWwwwwwwwwwWwvwwvwwWWwwwwWwwvwWwwwwwwwwwwWWWwWWWwwwwwwwwwWWWWWwWWWWWwwwwwwwwwwwwWWwWWWWWwvwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwWwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwWWWWWWwvwwwwwWWWWWwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwWWWWWWWWWWWWWwWWWWWWWWWwwwwwwwWwwwwwwwWwwwwwwwWWWWwWWWWWWWWWWWwwwwwwWWWWWWWWwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwWWwWwwwwwwwwwwwwwWWWWWwWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwWWWWWWWWWWWWWWwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwWWWWwWWWWWWWwWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwWWWWwWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwvwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwWwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwWWWWWWwwwwwwWwwwwwwwwwwwwwwwwWwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwWwwwwwvwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvwwwwwvwWwwWwwwwwwwwwwwvwwWWwwWWWWwwWwwwwwwwWwWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwWWwWwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwWWwvWwvwvWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWwwwWWwWwwwwwwwwwwwwwwwwwWwWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwWWwvwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwWWWWwvwwwwwWWWWWwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWwWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwWWwWwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwWwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwWWWWWWWWwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWwwWwwwwWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwvwWWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwWWwWwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwvwwwwWWWWwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwWWWWwWwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWwwwwWWWWwwwwwwwwwwwwwwwwwwwwWwwwwwwwWWWwWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvwWWWWWWWWWwWWWwwwWwwWwwwwwwwwwwwWwvwWWWWWWWWWWWWWWWwWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWw` | |
| % hello.grass | |
| let hello-grass = `wvwwWWwwWWWWWwwWWWWWwwvWwvwwWWwWWWwvWwWwwwwwwwWWWwWWWwWWWWWwWWWWWWwWwwwwwwwwwwwwwWWWWwWWWWWWwvwvWwwwwwwwwwwwwwwwwWwwwWWwWWWWWWWWWWWwwWWWWWWWWWWWWWwWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWwwwwwwwwwWWWWWWWWWWWWWWWWWwvwvWwwwwwwwwwwvwWWwWWWwWWWWwvWWwwwwWWWwWWWWWWWWwWWWWWWwwwwwwwwwwwwwwwwwwwwwwwWwwwwWWWwWwwWWWWWWWWwwwWWwWwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwWWWWWWWWwwwwWWwWwwwwwwWWWWWWWWWWWWWWWwwwwwwwWWwWwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwvw` | |
| in | |
| StdJa.document (| | |
| title = {hello.grass on grass.grass on grass.grass on grass.satyg}; | |
| author = {youz}; | |
| show-title = false; | |
| show-toc = false; | |
| |) '< | |
| +Grass(grass-grass)(grass-grass ^ `V` ^ hello-grass); | |
| > |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment