{ "__schema" : "4.1", "__type" : "page", "children" : { "__type" : "snippets", "items" : [ { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T17:59:53.327975+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "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" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:01:44.277599+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-12T12:51:15.652112+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 wasn’t particularly interested in. Instead, the Carp LanguageLink server uses the one provided by PythonBridge (which can be found [in the PythonBridge repository](https://github.com/feenkcom/PythonBridge/tree/master/PythonBridgeRuntime)). 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" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:06:15.752492+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "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 don’t 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" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T17:49:05.418793+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "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" } }