Multiple changes:

- Move to a Python process for the LanguageLink client [fixes #1, presumably]
- Finish a first rough draft of the booklet [fixes #4]
This commit is contained in:
2022-06-11 18:43:17 +02:00
parent acded68da5
commit 6369d15e93
39 changed files with 3977 additions and 56 deletions

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",
@@ -41,43 +79,6 @@
},
"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" : {
@@ -231,7 +232,119 @@
"__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-06-11T17:49:20.565513+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:20.565513+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "UXDVu4+dDQC/fqHFA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[Building a LanguageLink client]]"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:33.223032+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:33.223032+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "6dWWvI+dDQC/gM7QA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[Building a LanguageLink server]]"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:45.88618+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:48.608001+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "rYmTAZCdDQC/qIzPA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[What now?]]"
}
]
},
"createEmail" : {
"__type" : "email",
@@ -264,6 +377,81 @@
},
"string" : "[[Executing code]]"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:07:50.665361+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:07:59.692968+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "3NNC/o+dDQC/oLtxA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[Hooking up your LanguageLink server]]"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:54.91122+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:11.691776+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "uAjiAZCdDQC/qqUDA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[A custom snippet type]]"
},
{
"__type" : "textSnippet",
"children" : {

View File

@@ -232,7 +232,119 @@
"__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-06-11T17:49:20.565513+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:20.565513+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "UXDVu4+dDQC/fqHFA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[Building a LanguageLink client]]"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:33.223032+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:33.223032+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "6dWWvI+dDQC/gM7QA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[Building a LanguageLink server]]"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:45.88618+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:48.608001+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "rYmTAZCdDQC/qIzPA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[What now?]]"
}
]
},
"createEmail" : {
"__type" : "email",
@@ -265,6 +377,118 @@
},
"string" : "[[Executing code]]"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:07:50.665361+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:07:59.692968+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "3NNC/o+dDQC/oLtxA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[Hooking up your LanguageLink server]]"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:54.91122+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:11.691776+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "uAjiAZCdDQC/qqUDA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[A custom snippet type]]"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:03.097269+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:05.781133+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "j+IkapCdDQCBVgDCA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "[[Fin]]"
},
{
"__type" : "textSnippet",
"children" : {

View File

@@ -325,14 +325,14 @@
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:07:38.104346+02:00"
"dateAndTimeString" : "2022-06-11T16:35:43.289314+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Ddc1ljyZDQCZq2mSDqn2mw=="
},
"code" : "; this is what we will be able to do\r(IO.defn hello-world []\r (IO.println \"Hello world!\"))"
"code" : "; this is what we will be able to do\r(defn hello-world []\r (IO.println \"Hello world!\"))"
},
{
"__type" : "textSnippet",

View File

@@ -325,7 +325,7 @@
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:08:04.346367+02:00"
"dateAndTimeString" : "2022-06-11T16:35:43.289314+02:00"
}
},
"uid" : {
@@ -359,7 +359,7 @@
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T16:54:20.656267+02:00"
"dateAndTimeString" : "2022-06-11T17:10:18.677811+02:00"
}
},
"uid" : {

View File

@@ -0,0 +1,113 @@
{
"__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-06-11T11:30:43.257961+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:48:16.142343+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "JUkMyTyZDQCZxrrZDqn2mw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Getting code to execute is most likely the most tricky part of adding a language to GT. Most of the code in the Carp IDE deals with handling that part of the IDE experience. Additionally, LanguageLink requires a custom server setup, which needed to be written outside of GT."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:48:20.869905+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:48:46.359725+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "dwEUdoqdDQC+EJoFA3UANg=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Because both parts of this process make a cohesive whole, I split this chapter into two sub-chapters, [[B"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:10:47.300048+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:10:47.300048+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Executing code"
},
"uid" : {
"__type" : "uuid",
"uuid" : "647f0bc9-3c99-0d00-99c5-5d710ea9f69b"
}
}

View File

@@ -18,7 +18,7 @@
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:10:53.313378+02:00"
"dateAndTimeString" : "2022-06-11T11:30:43.257961+02:00"
}
},
"editEmail" : {
@@ -29,7 +29,7 @@
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T17:10:53.833743+02:00"
"dateAndTimeString" : "2022-06-11T17:48:16.142343+02:00"
}
},
"uid" : {
@@ -39,7 +39,44 @@
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "TODO"
"string" : "Getting code to execute is most likely the most tricky part of adding a language to GT. Most of the code in the Carp IDE deals with handling that part of the IDE experience. Additionally, LanguageLink requires a custom server setup, which needed to be written outside of GT."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:48:20.869905+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:02.268331+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "dwEUdoqdDQC+EJoFA3UANg=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Because both parts of this process make a cohesive whole, I split this chapter into two sub-chapters, [[Building a LanguageLink client]] and [[Building a LanguageLink server]]."
}
]
},

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-06-11T18:09:27.48233+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:42.790324+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "n0WyA5CdDQC/sEIUA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Now that we have a LanguageLink server, we are all set, right? Well, not quite."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:49.137549+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:10:53.048149+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "YxldBZCdDQC/s15wA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Usually, a LanguageLink server is used within snippets as a driver for code execution. While you can use it yourself to execute some custom code and find some pleasure in that, we will first need an interface to type code *into* to make it truly worth our while."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:10:55.085183+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:11:56.629038+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "ChpOCZCdDQC/tYwmA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "But I understand that after all of the effort of building a LanguageLink implementation for your target youre itching to try it out, so Ill give you a little teaser of how its going to be used in the snippet:"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:11:58.378929+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:12:53.87069+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "BW4QDZCdDQC/tz6wA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "{{gtMethod:GtCarpCoderModel>>#bindAndExecute:|expanded}}"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:13:00.938416+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:13:26.816542+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "LBHBEJCdDQC/9sJRA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "This means that a simple snippet to test your LanguageLink implementation might look like this:"
},
{
"__type" : "pharoSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:13:37.920717+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:18:19.754957+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "EjsQE5CdDQC/+NLCA8ExpA=="
},
"code" : "sourceString := '(IO.println \"Hello World!\")'.\t\"change this to your language\"\r\rapplication := CarpApplication uniqueInstance. \"change this to your application, might need to initialize the unique instance\"\rapplication isRunning ifFalse: [ application start ].\rcommandFactory := application newCommandFactory.\r\rcommandFactory\r\t<< sourceString;\r\tsendAndWait"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:20.062163+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:20.062163+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "What now?"
},
"uid" : {
"__type" : "uuid",
"uuid" : "9b9eb103-909d-0d00-bfaf-1b1203c131a4"
}
}

View File

@@ -0,0 +1,295 @@
{
"__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-06-11T18:09:27.48233+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:42.790324+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "n0WyA5CdDQC/sEIUA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Now that we have a LanguageLink server, we are all set, right? Well, not quite."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:49.137549+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:10:53.048149+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "YxldBZCdDQC/s15wA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Usually, a LanguageLink server is used within snippets as a driver for code execution. While you can use it yourself to execute some custom code and find some pleasure in that, we will first need an interface to type code *into* to make it truly worth our while."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:10:55.085183+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:11:56.629038+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "ChpOCZCdDQC/tYwmA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "But I understand that after all of the effort of building a LanguageLink implementation for your target youre itching to try it out, so Ill give you a little teaser of how its going to be used in the snippet:"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:11:58.378929+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:12:53.87069+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "BW4QDZCdDQC/tz6wA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "{{gtMethod:GtCarpCoderModel>>#bindAndExecute:|expanded}}"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:13:00.938416+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:13:26.816542+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "LBHBEJCdDQC/9sJRA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "This means that a simple snippet to test your LanguageLink implementation might look like this:"
},
{
"__type" : "pharoSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:13:37.920717+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:18:32.957333+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "EjsQE5CdDQC/+NLCA8ExpA=="
},
"code" : "sourceString := '(IO.println \"Hello World!\")'.\t\"change this to your language\"\r\rapplication := CarpApplication uniqueInstance.\t\"change this to your application, might need to initialize the unique instance\"\rapplication isRunning ifFalse: [ application start ].\rcommandFactory := application newCommandFactory.\r\rcommandFactory\r\t<< sourceString;\r\tsendAndWait"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:18:42.650713+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:18:48.915283+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "pPclJZCdDQCADqoCA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "And that should be all you need to get going!"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:20.062163+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:20.062163+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "What now?"
},
"uid" : {
"__type" : "uuid",
"uuid" : "9b9eb103-909d-0d00-bfaf-1b1203c131a4"
}
}

View File

@@ -0,0 +1,187 @@
{
"__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-06-11T18:18:58.358497+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:19:44.830424+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "n4phA5CdDQC/rbQ7A8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "After the doozy that is setting up LanguageLink, you might think that making a custom snippet type is going to be even more effort. Ive got good news for you."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:19:51.016989+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:25:16.445558+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Occ9KZCdDQCAEXGwA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Creating a snippet type is actually quite simple. Almost all of the code for Carp is in the Carp package, under the tag Lepiter (TODO: gtPackage annotation would be great). The most important class is likely {{gtClass:LeCarpSnippet}}, because like {{gtClass:CarpApplication}} for LanguageLink, this class is the central player around which the rest of the team organizes."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:25:29.637968+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:29:22.376041+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "pS1HPZCdDQCAOUdiA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Most of the code you will write will just be specialization over readily-available Lepiter classes. The only things that will be truly custom will most likely be your version of {{gtClass:LeExternalServerStrategy}} (in the case of Carp that is {{gtClass:LeCarpApplicationStrategy}}), which will bridge the gap between your LanguageLink application and the snippet itself, and your {{gtClass:GtSourceCoder}}, which"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:28:08.711515+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:28:15.191912+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Dv7PRJCdDQCASGWFA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "But more about that in the next section!"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:14.768068+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:14.768068+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "A custom snippet type"
},
"uid" : {
"__type" : "uuid",
"uuid" : "6ad66003-909d-0d00-bfac-dd3803c131a4"
}
}

View File

@@ -0,0 +1,187 @@
{
"__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-06-11T18:18:58.358497+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:19:44.830424+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "n4phA5CdDQC/rbQ7A8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "After the doozy that is setting up LanguageLink, you might think that making a custom snippet type is going to be even more effort. Ive got good news for you."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:19:51.016989+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:25:16.445558+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Occ9KZCdDQCAEXGwA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Creating a snippet type is actually quite simple. Almost all of the code for Carp is in the Carp package, under the tag Lepiter (TODO: gtPackage annotation would be great). The most important class is likely {{gtClass:LeCarpSnippet}}, because like {{gtClass:CarpApplication}} for LanguageLink, this class is the central player around which the rest of the team organizes."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:25:29.637968+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:29:42.230718+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "pS1HPZCdDQCAOUdiA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Most of the code you will write will just be specialization over readily-available Lepiter classes. The only things that will be truly custom will most likely be your version of {{gtClass:LeExternalServerStrategy}} (in the case of Carp that is {{gtClass:LeCarpApplicationStrategy}}), which will bridge the gap between your LanguageLink application and the snippet itself, and your {{gtClass:GtSourceCoder}} ({{gtClass:GtCarpCoderModel}})."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:28:08.711515+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:28:15.191912+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Dv7PRJCdDQCASGWFA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "But more about that in the next section!"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:14.768068+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:09:14.768068+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "A custom snippet type"
},
"uid" : {
"__type" : "uuid",
"uuid" : "6ad66003-909d-0d00-bfac-dd3803c131a4"
}
}

View File

@@ -0,0 +1,150 @@
{
"__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-06-11T17:59:53.327975+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:01:42.598848+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "bUpMu4+dDQC/fPzrA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Theoretically, you can use any technology that supports HTTP, JSON, and possibly MessagePack to construct a LanguageLink server, and you might be tempted to just do it in the language you are targetting, especially since it is quite likely that you are comfortable in it."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:01:44.277599+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:06:06.353672+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Yzt86I+dDQC/lywBA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "I too was tempted to go down that route before realizing that that would mean understanding and implementing the LanguageLink protocol, a task I wasnt particularly interested in. Instead, the Carp LanguageLink server uses the one provided by PythonBridge (which can be found [in the PythonBridge repository TODO: good link](github.com/feenkcom/pythonbridge)). It includes all the infrastructure needed, and the only thing that likely needs to be changed is how `EvalCommand`s are handled: in the case of Carp, a simple subprocess handler that feeds the statements into a Carp REPL and reads the result. You can inspect the custom code I wrote [in the gt4carp repository TODO: good link](https://git.veitheller.de/carpentry/gt4carp)."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:06:15.752492+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:07:19.529977+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "tJmV+I+dDQC/nrmHA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "While I understand that this is a rather terse “figure it out yourself”, I dont know the ins and outs of the LanguageLink protocol well enough to assist you any more—precisely because I took t"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:05.418793+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:05.418793+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Building a LanguageLink server"
},
"uid" : {
"__type" : "uuid",
"uuid" : "e4a14bbb-8f9d-0d00-bf7b-383c03c131a4"
}
}

View File

@@ -0,0 +1,150 @@
{
"__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-06-11T17:59:53.327975+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:01:42.598848+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "bUpMu4+dDQC/fPzrA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Theoretically, you can use any technology that supports HTTP, JSON, and possibly MessagePack to construct a LanguageLink server, and you might be tempted to just do it in the language you are targetting, especially since it is quite likely that you are comfortable in it."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:01:44.277599+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:06:06.353672+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "Yzt86I+dDQC/lywBA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "I too was tempted to go down that route before realizing that that would mean understanding and implementing the LanguageLink protocol, a task I wasnt particularly interested in. Instead, the Carp LanguageLink server uses the one provided by PythonBridge (which can be found [in the PythonBridge repository TODO: good link](github.com/feenkcom/pythonbridge)). It includes all the infrastructure needed, and the only thing that likely needs to be changed is how `EvalCommand`s are handled: in the case of Carp, a simple subprocess handler that feeds the statements into a Carp REPL and reads the result. You can inspect the custom code I wrote [in the gt4carp repository TODO: good link](https://git.veitheller.de/carpentry/gt4carp)."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:06:15.752492+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:07:40.565555+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "tJmV+I+dDQC/nrmHA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "While I understand that this is a rather terse “figure it out yourself”, I dont know the ins and outs of the LanguageLink protocol well enough to assist you any more—precisely because I took the effort of side-stepping the issue entirely. Hopefully you can too!"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:05.418793+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:05.418793+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Building a LanguageLink server"
},
"uid" : {
"__type" : "uuid",
"uuid" : "e4a14bbb-8f9d-0d00-bf7b-383c03c131a4"
}
}

View File

@@ -0,0 +1,261 @@
{
"__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-06-11T18:28:18.00762+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:30:10.327276+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "xNZI/4+dDQC/o+CfA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Finally, finally we get to have a snippet type that actually knows how to execute code!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:30:14.076728+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:31:02.274958+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "t3BjTpCdDQCAUTe6A8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "To make that happen, we will need an application strategy. Building one should be fairly straightforward, since it mostly holds onto your LanguageLink application and builds new ones if needed."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:31:19.494771+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:32:06.868833+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "E6NbUZCdDQCAU8nsA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "More interesting will be your coder model, which is responsible for taking source code from an application, handing it over to LanguageLink, and displaying the result. As such, it is the main link between the IDE and the execution engine."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:32:07.688865+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:34:29.49505+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "ypstVZCdDQCAYOo/A8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "In the section [[What now?]] I already showcased the method that is most central to that process: `bindAndExecute:`. In my case, {{gtMethod:GtCarpCoderModel>>#bindAndExecute:|expanded}} is the final result. A quick refresher:"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:34:40.493148+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:36:37.301362+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "WALsXZCdDQCBUGyRA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "The method will take in a source string directly from coder and send it off to the evaluator handled by the LanguageLink application. Before that happens, though, it will most likely add some funky code around the snippet to capture the statement as a variable if possible, to allow for better interaction with GT."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:36:42.952545+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:37:23.855402+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "R7ljZZCdDQCBUlkLA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "It might be more useful for you to start with a trimmed-down version of this method that doesnt do anything with the bindings and just hands over the source string as-is. To harness the full power of interacting with G"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:06.046507+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:06.046507+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Hooking up your LanguageLink server"
},
"uid" : {
"__type" : "uuid",
"uuid" : "e53a48ff-8f9d-0d00-bfa2-217603c131a4"
}
}

View File

@@ -0,0 +1,261 @@
{
"__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-06-11T18:28:18.00762+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:30:10.327276+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "xNZI/4+dDQC/o+CfA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Finally, finally we get to have a snippet type that actually knows how to execute code!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:30:14.076728+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:31:02.274958+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "t3BjTpCdDQCAUTe6A8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "To make that happen, we will need an application strategy. Building one should be fairly straightforward, since it mostly holds onto your LanguageLink application and builds new ones if needed."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:31:19.494771+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:32:06.868833+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "E6NbUZCdDQCAU8nsA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "More interesting will be your coder model, which is responsible for taking source code from an application, handing it over to LanguageLink, and displaying the result. As such, it is the main link between the IDE and the execution engine."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:32:07.688865+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:34:29.49505+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "ypstVZCdDQCAYOo/A8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "In the section [[What now?]] I already showcased the method that is most central to that process: `bindAndExecute:`. In my case, {{gtMethod:GtCarpCoderModel>>#bindAndExecute:|expanded}} is the final result. A quick refresher:"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:34:40.493148+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:36:37.301362+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "WALsXZCdDQCBUGyRA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "The method will take in a source string directly from coder and send it off to the evaluator handled by the LanguageLink application. Before that happens, though, it will most likely add some funky code around the snippet to capture the statement as a variable if possible, to allow for better interaction with GT."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:36:42.952545+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:37:38.760779+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "R7ljZZCdDQCBUlkLA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "It might be more useful for you to start with a trimmed-down version of this method that doesnt do anything with the bindings and just hands over the source string as-is. To harness the full power of interacting with GT, however, we will need to send variables and values back and forth sooner or later."
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:06.046507+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:08:06.046507+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Hooking up your LanguageLink server"
},
"uid" : {
"__type" : "uuid",
"uuid" : "e53a48ff-8f9d-0d00-bfa2-217603c131a4"
}
}

View File

@@ -0,0 +1,224 @@
{
"__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-06-11T18:38:08.96254+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:10.799078+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "6bymapCdDQCBW13UA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "You made it!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:12.929099+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:56.257815+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "IW3tapCdDQCBXcd8A8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "If you read this booklet linearly from start to finish and followed along with your own implementation, you should now be able to execute code in custom Lepiter snippets! Exciting indeed!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:59.504959+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:40:09.625312+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "4R2abZCdDQCBX8vQA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Now, of course, the fun doesnt stop here. For full interactivity, we might need to (de)serialize values in an almost seamless manner, like JSLink does. To do that, we will have to make GT understand our language semantically rather than just syntactically."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:40:10.264658+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:41:08.513478+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "kHzzcZCdDQCBYawWA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "We could also start using GTs powers to visualize things about our codebase or to generate code, or we might want to create a custom IDE. Some of these fun adventures you will have to embark on on your own, but if you want some inspiration, the [[Bonus Chapters]] might hold some interest to you."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:41:12.090085+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:41:24.342689+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "nEKhdZCdDQCBgxEjA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "I hope you enjoyed our little journey, congratulate you to your new po"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:07.35881+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:07.35881+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Fin"
},
"uid" : {
"__type" : "uuid",
"uuid" : "1d13a66a-909d-0d00-815a-f07803c131a4"
}
}

View File

@@ -0,0 +1,224 @@
{
"__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-06-11T18:38:08.96254+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:10.799078+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "6bymapCdDQCBW13UA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "You made it!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:12.929099+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:56.257815+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "IW3tapCdDQCBXcd8A8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "If you read this booklet linearly from start to finish and followed along with your own implementation, you should now be able to execute code in custom Lepiter snippets! Exciting indeed!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:59.504959+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:40:09.625312+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "4R2abZCdDQCBX8vQA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Now, of course, the fun doesnt stop here. For full interactivity, we might need to (de)serialize values in an almost seamless manner, like JSLink does. To do that, we will have to make GT understand our language semantically rather than just syntactically."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:40:10.264658+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:41:08.513478+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "kHzzcZCdDQCBYawWA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "We could also start using GTs powers to visualize things about our codebase or to generate code, or we might want to create a custom IDE. Some of these fun adventures you will have to embark on on your own, but if you want some inspiration, the [[Bonus Chapters]] might hold some interest to you."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:41:12.090085+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:41:41.069403+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "nEKhdZCdDQCBgxEjA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "I hope you enjoyed our little journey and congratulate you to your new powers! See you around."
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:07.35881+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T18:38:07.35881+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Fin"
},
"uid" : {
"__type" : "uuid",
"uuid" : "1d13a66a-909d-0d00-815a-f07803c131a4"
}
}

View File

@@ -0,0 +1,224 @@
{
"__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-06-11T17:49:47.434396+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:50:11.430885+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "YVM4u4+dDQC/eTezA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Building a LanguageLink client is easy, but not necessarily simple, since it involves writing a lot of mostly glue code."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:50:15.711236+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:52:49.226165+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "suJsv4+dDQC/h6EvA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "As an entry-point, you will have to write a {{gtClass:LanguageLinkApplication}}. The (very spartan) one for Carp is {{gtClass:CarpApplication}}. Writing the application will give you a lay of the land, since its the central piece of infrastructure that holds on to all the rest."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:52:50.001285+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:53:48.39118+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "/4qmyI+dDQC/i6IPA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "In the Carp application, I tried to use stock classes from LanguageLink wherever possible. Only when that didnt work did I add classes. I also took inspiration from {{gtClass:JSLinkApplication}}, since it was there and seemed to provide rich functionality."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:53:50.150304+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:57:15.031561+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "hy01zI+dDQC/j6rJA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "In total, all the classes that needed filling in were {{gtClass:CarpPostMortemDebugger}} (used in: {{gtMethod:CarpApplication>>debuggerClientFor:}}), {{gtClass:CarpExecutionHandler}} (used in {{gtMethod:CarpApplication>>#initializeHandlers}}), and all the classes in {{gtMethod:LanguageLinkSettings class>>carpDefaultSettings|expanded}} prefixed with `Carp`:"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:57:33.45648+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:59:17.862655+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "sPXB2I+dDQC/k6TTA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Implementing and understanding all of these classes might seem like a daunting task, and in many ways it is. But implementing most of these classes is simple and doesnt at first require a thorough understanding of the system, at least that was the case for me. This means that you can just browse the existing implementors of any specific piece of infrastructure and “compare notes”. This approach got me f"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:04.110462+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:04.110462+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Building a LanguageLink client"
},
"uid" : {
"__type" : "uuid",
"uuid" : "3aab37bb-8f9d-0d00-bf78-07ff03c131a4"
}
}

View File

@@ -0,0 +1,224 @@
{
"__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-06-11T17:49:47.434396+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:50:11.430885+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "YVM4u4+dDQC/eTezA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Building a LanguageLink client is easy, but not necessarily simple, since it involves writing a lot of mostly glue code."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:50:15.711236+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:52:49.226165+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "suJsv4+dDQC/h6EvA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "As an entry-point, you will have to write a {{gtClass:LanguageLinkApplication}}. The (very spartan) one for Carp is {{gtClass:CarpApplication}}. Writing the application will give you a lay of the land, since its the central piece of infrastructure that holds on to all the rest."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:52:50.001285+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:53:48.39118+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "/4qmyI+dDQC/i6IPA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "In the Carp application, I tried to use stock classes from LanguageLink wherever possible. Only when that didnt work did I add classes. I also took inspiration from {{gtClass:JSLinkApplication}}, since it was there and seemed to provide rich functionality."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:53:50.150304+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:57:15.031561+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "hy01zI+dDQC/j6rJA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "In total, all the classes that needed filling in were {{gtClass:CarpPostMortemDebugger}} (used in: {{gtMethod:CarpApplication>>debuggerClientFor:}}), {{gtClass:CarpExecutionHandler}} (used in {{gtMethod:CarpApplication>>#initializeHandlers}}), and all the classes in {{gtMethod:LanguageLinkSettings class>>carpDefaultSettings|expanded}} prefixed with `Carp`:"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:57:33.45648+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:59:36.36081+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "sPXB2I+dDQC/k6TTA8ExpA=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Implementing and understanding all of these classes might seem like a daunting task, and in many ways it is. But implementing most of these classes is simple and doesnt at first require a thorough understanding of the system, at least that was the case for me. This means that you can just browse the existing implementors of any specific piece of infrastructure and “compare notes”. This approach got me far enough to build a first version (with a little bit of added debugging), and it might get you there too!"
}
]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:04.110462+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T17:49:04.110462+02:00"
}
},
"pageType" : {
"__type" : "namedPage",
"title" : "Building a LanguageLink client"
},
"uid" : {
"__type" : "uuid",
"uuid" : "3aab37bb-8f9d-0d00-bf78-07ff03c131a4"
}
}

View File

@@ -2,5 +2,5 @@
"uuid" : "de53e067-3c99-0d00-9999-34310ea9f69b",
"tableOfContents" : "98eic2d1mangtosf26n3aq420",
"schema" : "4.1",
"databaseName" : "Adding a Language to the Glamorous Toolkit"
"databaseName" : "Adding a Language to Glamorous Toolkit"
}