From a99ef7b1589fac066a1eb5ca919a7760d84c735e Mon Sep 17 00:00:00 2001 From: Vanessa McHale Date: Wed, 9 Feb 2022 14:36:54 -0600 Subject: [PATCH] trim? add trim-whitespace/sed example doc --- doc/guide.md | 30 ++++++++++++++++++++++++++++++ doc/guide.pdf | Bin 196195 -> 196912 bytes docs/index.html | 18 ++++++++++++++++++ examples/trimwhitespace.jac | 3 +++ lib/sed.jac | 8 ++++++++ 5 files changed, 59 insertions(+) create mode 100644 examples/trimwhitespace.jac create mode 100644 lib/sed.jac diff --git a/doc/guide.md b/doc/guide.md index 51fa0beb..81443dcc 100644 --- a/doc/guide.md +++ b/doc/guide.md @@ -269,6 +269,36 @@ path"$0 `intercalate` is defined in `lib/string.jac`. +#### Example + +Suppose we want to mimic some functionality of `sed` - we'd like to replace +some regular expression with a string (no capture groups, only first replacement +per line) + +``` +@include'prelude/fn.jac' + +fn replace1(re, str, line) := + let + val insert := \line. \str. \ixes. + take (ixes->1) line + str + drop (ixes->2) line + in option line (insert line str) (match line re) end; +``` + +Then we could trim whitespace from a file with + +``` +@include'lib/sed.jac' + +(replace1 /\s+$/ '')"$0 +``` + +Jacinda does not modify files in-place so one would need to use [sponge](https://joeyh.name/code/moreutils/) perhaps: + +``` +ja run trimwhitespace.jac -i FILE | sponge FILE +``` + #### Parting Shots ``` diff --git a/doc/guide.pdf b/doc/guide.pdf index 4f4b961655a6a73db51d5713514cd100005e56eb..b375d734b3ab8f23c1ea3c0248fc509b991d1cf9 100644 GIT binary patch delta 18300 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 Includes path"$0

intercalate is defined in lib/string.jac.

+

Example

+

Suppose we want to mimic some functionality of sed - +we’d like to replace some regular expression with a string (no capture +groups, only first replacement per line)

+
@include'prelude/fn.jac'
+
+fn replace1(re, str, line) :=
+  let 
+    val insert := \line. \str. \ixes.
+      take (ixes->1) line + str + drop (ixes->2) line
+  in option line (insert line str) (match line re) end;
+

Then we could trim whitespace from a file with

+
@include'lib/sed.jac'
+
+(replace1 /\s+$/ '')"$0
+

Jacinda does not modify files in-place so one would need to use sponge perhaps:

+
ja run trimwhitespace.jac -i FILE | sponge FILE

Parting Shots

or := [(||)|#f x]
 
diff --git a/examples/trimwhitespace.jac b/examples/trimwhitespace.jac
new file mode 100644
index 00000000..3077c62e
--- /dev/null
+++ b/examples/trimwhitespace.jac
@@ -0,0 +1,3 @@
+@include'lib/sed.jac'
+
+(replace1 /\s+$/ '')"$0
diff --git a/lib/sed.jac b/lib/sed.jac
new file mode 100644
index 00000000..2b7cff30
--- /dev/null
+++ b/lib/sed.jac
@@ -0,0 +1,8 @@
+@include'prelude/fn.jac'
+
+{. example: (replace /^var/ 'export const')"$0
+fn replace1(re, str, line) :=
+  let 
+    val insert := \line. \str. \ixes.
+      take (ixes->1) line + str + drop (ixes->2) line
+  in option line (insert line str) (match line re) end;