Add more docs

This commit is contained in:
2022-04-17 22:43:27 +02:00
parent 8f48fc25c3
commit c4ef6fa095
8 changed files with 1548 additions and 5 deletions

View File

@@ -0,0 +1,258 @@
{
"__schema" : "4.1",
"__type" : "page",
"children" : {
"__type" : "snippets",
"items" : [
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:53.22701+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:24:36.631484+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Dm0UJUGZDQCKn/UjBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Before we build an IDE for Carp together, it might make sense to introduce you to Carp. Ive written about the language extensively on [my blog](https://veitheller.de), but Id like to take a stab at quickly introducing it here, for the purposes of this tutorial."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:24:37.857895+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:25:41.467247+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "x5dhK0GZDQCKodavBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "If the description whets your appetite, be sure to check it out [on Github](https://github.com) and join our community [on Gitter](https://gitter.im/carp-lang/carp)."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:27:45.487766+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:39:56.823586+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "i/93NkGZDQCKoyIwBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "##A short introduction"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:28:00.226582+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:32:49.704279+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "nlrWNkGZDQCKpcSZBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "As mentioned in the [[Introduction]], Carp is a **borrow-checked** language with **type inference** and **syntactic macros**. Outwardly, it takes the form of a Lisp akin to Clojure. The writing experience, however, is more like that of Rust or OCaml."
},
{
"__type" : "carpSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:32:53.393834+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:41:44.082741+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "0En4SEGZDQCMIJywBAU6hQ=="
},
"code" : "; while global statements exist, Carp does most of its work inside modules\r(defmodule MyMod\r\r\t; we have\r\t; - macros,\r\t(defmacro mymacro [x] (eval 'x)) ; 'x is short for (quote x)\r\t\r\t; - dynamic functions and values (available at compile time), and\r\t(defdynamic dval 1)\r\t(defndynamic dfun [x] (fn [] (+ dval 1)))\r\t\r\t; - static functions and values\r\t(def val \"hi\")\r\t(defn fun [] @val) ; @val is a shorthand for (copy val)\r\t; NB: strings are references by default, they need to be copied\r\t\r\t; other syntactic features include\r\t(def array [1 2 3])\r\t(def map {1 2, 3 4}) ; commas are optional and treated like whitespace\r\t(def ref-1 &1) ; &1 is short for (ref 1), the inverse to copy\r\t\r\t(defdynamic quasiquoted `(1 2 dval %dval)) ; expands to '(1 2 dval 1)\r\t; quasiquoting is a bit of a complicated beast, and I wont delve too much\r\t; on it.\r\t\r\t; different number types have different suffixes\r\t(def an-int 1)\r\t(def a-long 1l)\r\t(def a-byte 1b)\r\t(def a-float 1.0f)\r\t(def a-double 1.0)\r)"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:41:52.766276+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:42:04.686614+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "CkwFaUGZDQCMI8MVBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "While Carp naturally has many more features, this should be enough to"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:51.219115+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:51.219115+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Interlude: An Introduction to Carp"
},
"uid" : {
"__type" : "uuid",
"uuid" : "6ed41325-4199-0d00-8a9e-533904053a85"
}
}

View File

@@ -0,0 +1,258 @@
{
"__schema" : "4.1",
"__type" : "page",
"children" : {
"__type" : "snippets",
"items" : [
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:53.22701+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:24:36.631484+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Dm0UJUGZDQCKn/UjBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Before we build an IDE for Carp together, it might make sense to introduce you to Carp. Ive written about the language extensively on [my blog](https://veitheller.de), but Id like to take a stab at quickly introducing it here, for the purposes of this tutorial."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:24:37.857895+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:25:41.467247+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "x5dhK0GZDQCKodavBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "If the description whets your appetite, be sure to check it out [on Github](https://github.com) and join our community [on Gitter](https://gitter.im/carp-lang/carp)."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:27:45.487766+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:39:56.823586+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "i/93NkGZDQCKoyIwBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "##A short introduction"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:28:00.226582+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:32:49.704279+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "nlrWNkGZDQCKpcSZBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "As mentioned in the [[Introduction]], Carp is a **borrow-checked** language with **type inference** and **syntactic macros**. Outwardly, it takes the form of a Lisp akin to Clojure. The writing experience, however, is more like that of Rust or OCaml."
},
{
"__type" : "carpSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:32:53.393834+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:41:44.082741+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "0En4SEGZDQCMIJywBAU6hQ=="
},
"code" : "; while global statements exist, Carp does most of its work inside modules\r(defmodule MyMod\r\r\t; we have\r\t; - macros,\r\t(defmacro mymacro [x] (eval 'x)) ; 'x is short for (quote x)\r\t\r\t; - dynamic functions and values (available at compile time), and\r\t(defdynamic dval 1)\r\t(defndynamic dfun [x] (fn [] (+ dval 1)))\r\t\r\t; - static functions and values\r\t(def val \"hi\")\r\t(defn fun [] @val) ; @val is a shorthand for (copy val)\r\t; NB: strings are references by default, they need to be copied\r\t\r\t; other syntactic features include\r\t(def array [1 2 3])\r\t(def map {1 2, 3 4}) ; commas are optional and treated like whitespace\r\t(def ref-1 &1) ; &1 is short for (ref 1), the inverse to copy\r\t\r\t(defdynamic quasiquoted `(1 2 dval %dval)) ; expands to '(1 2 dval 1)\r\t; quasiquoting is a bit of a complicated beast, and I wont delve too much\r\t; on it.\r\t\r\t; different number types have different suffixes\r\t(def an-int 1)\r\t(def a-long 1l)\r\t(def a-byte 1b)\r\t(def a-float 1.0f)\r\t(def a-double 1.0)\r)"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:41:52.766276+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:42:24.609911+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "CkwFaUGZDQCMI8MVBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "While Carp naturally has many more features, this little snippet should be enough to help you get through this booklet!"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:51.219115+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:51.219115+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Interlude: An Introduction to Carp"
},
"uid" : {
"__type" : "uuid",
"uuid" : "6ed41325-4199-0d00-8a9e-533904053a85"
}
}

View File

@@ -41,6 +41,43 @@
},
"string" : "[[Introduction]]"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:30.537898+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:30.537898+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "3kLYI0GZDQCKnLdXBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : ""
},
{
"__type" : "textSnippet",
"children" : {
@@ -269,6 +306,43 @@
},
"string" : "[[Visualizing code using our AST]]"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T19:34:12.409264+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T19:34:16.722303+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "CL7byT6ZDQCdyqowDqn2mw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[Generating Code]]"
},
{
"__type" : "textSnippet",
"children" : {

View File

@@ -8,7 +8,45 @@
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
"items" : [
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:31.801924+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:40.406467+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "3kLYI0GZDQCKnLdXBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[Interlude: An Introduction to Carp]]"
}
]
},
"createEmail" : {
"__type" : "email",

View File

@@ -29,7 +29,7 @@
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:18:43.697823+02:00"
"dateAndTimeString" : "2022-04-17T18:18:44.200231+02:00"
}
},
"uid" : {
@@ -39,7 +39,226 @@
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "In this bonus chapter, we are going to learn how to visualize code using just the AST. While you cannot expect the highest level of semantic insight from analyses that purely focus on the AST, it can be a fun and interesting challenge, and give you some ideas on how to work with ASTs."
"string" : "In this bonus chapter, we are going to learn how to visualize code using just the AST. While you cannot expect the highest level of semantic insight from analyses that purely focus on the AST, it can be a fun and interesting challenge, and give you some ideas on how to work with ASTs."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T21:59:36.075691+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:00:54.834762+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "yZ0R0UCZDQCJmVqTBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "When I first got the Carp parser working, for instance, I asked myself the question “How are the files in the standard library interconnected?” Using the parser and a simple wrapper class named {{gtClass:CarpFile}} I was able to answer that question within minutes."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:12:07.557482+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:13:44.45603+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "32aj/kCZDQCJp1bbBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "First, I parsed all the files from the standard library and got all the `load` statements. From that, I built a mapping from files to the files they include."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:09:14.547385+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:12:30.516602+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Fbbt1kCZDQCJm4QRBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "{{gtExample:CarpFile class >> #coreLoadStatements |codeExpanded=false| previewExpanded=true|previewShow=#gtItemsFor:}}"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:13:49.336046+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:14:51.084501+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "lh+yBEGZDQCJqXdGBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "From there, it is just a matter of visualizing the data. {{gtClass:GtMondrian}} is a powerful visualization tool for such questions, and fairly quick to use."
},
{
"__type" : "pharoSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:14:58.363273+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:15:49.272055+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "t5/kCEGZDQCJsYevBAU6hQ=="
},
"code" : "\"the mapping from above\"\raDict := CarpFile coreLoadStatements.\r\r\"the actual view\"\rview := GtMondrian new. \rview nodes\r\tstencil: [:each |\r\t\tBlElement new\r\t\t\tsize: 5@5;\r\t\t\tgeometry: BlCircleGeometry new;\r\t\t\tbackground: Color gray ];\r\twith: aDict keys.\rview edges connectToAll: [:each | aDict at: each ]. \rview layout force. \rview"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:16:02.024437+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:16:30.971495+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "6gxuDEGZDQCJuCEYBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "This was the first such question I asked, and realizing how quickly I got an answer and how easy it was, I felt emboldened"
}
]
},

View File

@@ -40,6 +40,225 @@
"__type" : "textStyle"
},
"string" : "In this bonus chapter, we are going to learn how to visualize code using just the AST. While you cannot expect the highest level of semantic insight from analyses that purely focus on the AST, it can be a fun and interesting challenge, and give you some ideas on how to work with ASTs."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T21:59:36.075691+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:00:54.834762+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "yZ0R0UCZDQCJmVqTBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "When I first got the Carp parser working, for instance, I asked myself the question “How are the files in the standard library interconnected?” Using the parser and a simple wrapper class named {{gtClass:CarpFile}} I was able to answer that question within minutes."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:12:07.557482+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:13:44.45603+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "32aj/kCZDQCJp1bbBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "First, I parsed all the files from the standard library and got all the `load` statements. From that, I built a mapping from files to the files they include."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:09:14.547385+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:12:30.516602+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Fbbt1kCZDQCJm4QRBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "{{gtExample:CarpFile class >> #coreLoadStatements |codeExpanded=false| previewExpanded=true|previewShow=#gtItemsFor:}}"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:13:49.336046+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:14:51.084501+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "lh+yBEGZDQCJqXdGBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "From there, it is just a matter of visualizing the data. {{gtClass:GtMondrian}} is a powerful visualization tool for such questions, and fairly quick to use."
},
{
"__type" : "pharoSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:14:58.363273+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:15:49.272055+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "t5/kCEGZDQCJsYevBAU6hQ=="
},
"code" : "\"the mapping from above\"\raDict := CarpFile coreLoadStatements.\r\r\"the actual view\"\rview := GtMondrian new. \rview nodes\r\tstencil: [:each |\r\t\tBlElement new\r\t\t\tsize: 5@5;\r\t\t\tgeometry: BlCircleGeometry new;\r\t\t\tbackground: Color gray ];\r\twith: aDict keys.\rview edges connectToAll: [:each | aDict at: each ]. \rview layout force. \rview"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:16:02.024437+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:16:43.097036+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "6gxuDEGZDQCJuCEYBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "This was the first such question I asked, and realizing how quickly I got an answer and how easy it was, I felt emboldened to ask more such questions. Maybe you will, too!"
}
]
},

View File

@@ -0,0 +1,258 @@
{
"__schema" : "4.1",
"__type" : "page",
"children" : {
"__type" : "snippets",
"items" : [
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:18:11.30244+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:18:46.237869+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "uOr60zyZDQCZ0YDZDqn2mw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Having a fully fledged IDE at your fingertips is a glorious feeling. Im sure if youve played with Glamorous Toolkit, you know what Im talking about—not just a glorified editor, but an actual IDE!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:18:52.344691+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:19:25.198132+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "dTeKFkGZDQCJw/4CBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "I had long wished for something similar for other languages, and my ultimate goal, as I mentioned in the [[Introduction]], was building one for Carp."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:19:42.265195+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:20:39.192518+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "9TLKGUGZDQCJ5s4DBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Well, here it is."
},
{
"__type" : "pharoSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:19:49.370029+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:20:04.341282+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "5gg9GkGZDQCJ66tmBAU6hQ=="
},
"code" : "CarpModuleCoder forModule: ('Example' asCarpModule addExpression:\r\t\t (CarpDynamicVariable\r\t\t\t named: 'x' asCarpSymbol\r\t\t\t binding: 1 asCarpInteger))"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:19:29.037036+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:21:03.562716+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "ZQv/GEGZDQCJ5Av+BAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "In this chapter, I will detail how I got there, and how you might be able to build similar facilities for your language of choice."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:21:06.281004+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:01.589023+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "qlHHHkGZDQCJ7bs7BAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "A quick disclaimer before we start: Im using the intermediate representation introduced in [[Generating Code]]. You might need to get familiar with that chapter before movi"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:13:50.717236+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:13:50.717236+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "A coder of ones own"
},
"uid" : {
"__type" : "uuid",
"uuid" : "cb38fad3-3c99-0d00-99d0-e4fc0ea9f69b"
}
}

View File

@@ -18,7 +18,7 @@
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:13:52.19432+02:00"
"dateAndTimeString" : "2022-04-17T22:18:11.30244+02:00"
}
},
"editEmail" : {
@@ -29,7 +29,7 @@
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:13:52.757701+02:00"
"dateAndTimeString" : "2022-04-17T22:18:46.237869+02:00"
}
},
"uid" : {
@@ -39,6 +39,225 @@
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Having a fully fledged IDE at your fingertips is a glorious feeling. Im sure if youve played with Glamorous Toolkit, you know what Im talking about—not just a glorified editor, but an actual IDE!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:18:52.344691+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:19:25.198132+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "dTeKFkGZDQCJw/4CBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "I had long wished for something similar for other languages, and my ultimate goal, as I mentioned in the [[Introduction]], was building one for Carp."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:19:42.265195+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:20:39.192518+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "9TLKGUGZDQCJ5s4DBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Well, here it is."
},
{
"__type" : "pharoSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:19:49.370029+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:20:04.341282+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "5gg9GkGZDQCJ66tmBAU6hQ=="
},
"code" : "CarpModuleCoder forModule: ('Example' asCarpModule addExpression:\r\t\t (CarpDynamicVariable\r\t\t\t named: 'x' asCarpSymbol\r\t\t\t binding: 1 asCarpInteger))"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:19:29.037036+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:21:03.562716+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "ZQv/GEGZDQCJ5Av+BAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "In this chapter, I will detail how I got there, and how you might be able to build similar facilities for your language of choice."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:21:06.281004+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:11.968841+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "qlHHHkGZDQCJ7bs7BAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "A quick disclaimer before we start: Im using the intermediate representation introduced in [[Generating Code]]. You might need to get familiar with that chapter before making your way through this one."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:13.646691+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T22:22:14.249896+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "KCfLIkGZDQCKltcPBAU6hQ=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "TODO"
}
]