You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
8.0KB

  1. <!DOCTYPE html>
  2. <html>
  3. <meta charset="utf-8">
  4. <head>
  5. <link rel="stylesheet" href="../../style.css">
  6. </head>
  7. <body>
  8. <script data-goatcounter="https://services.opengamestudio.org:443/count" async src="//services.opengamestudio.org:443/count.js"></script>
  9. <div id="header">
  10. <div class="header2">
  11. <div class="menu">
  12. <a href="../../ru/news/index.html">Новости</a>
  13. <a href="../../ru/game/index.html">Игры</a>
  14. <a href="../../ru/tool/index.html">Инструменты</a>
  15. <a href="../../ru/page/about.html">О нас</a>
  16. </div>
  17. <div id="lang">
  18. <a href="../../en/news/cld_ctx-gen.html">EN</a>
  19. <a href="../../ru/news/cld_ctx-gen.html">RU</a>
  20. </div>
  21. <div class="clear"></div>
  22. </div>
  23. </div>
  24. <h3 class="left_item_title">В новостях...</h3>
  25. <center>
  26. <div class="news_item">
  27. <h2 class="news_item_title">
  28. <a href="cld_ctx-gen.html">CLD: Генерация контекста</a>
  29. </h2>
  30. <p class="news_item_date">
  31. 2025-03-11 00:00
  32. </p>
  33. <div class="news_item_contents">
  34. <p><img src="../../images/2025-03_redux-data-flow.jpg" alt="splash" /></p>
  35. <h1 id="">Генерация контекста</h1>
  36. <p>В феврале доработал транслятор Межъязыкового диалекта
  37. (<strong>C</strong>ross-<strong>l</strong>anguage <strong>d</strong>ialect) (CLD) до генерации
  38. Контекста на основе описания в YML. Сгенерированные Контексты уже использованы
  39. в следующих проектах:</p>
  40. <ul>
  41. <li>CLD (транслятор CLD генерирует свой собственный Контекст)</li>
  42. <li>LHA</li>
  43. <li>PSKOV</li>
  44. </ul>
  45. <p>Доселе я никогда прежде не тратил время на объяснение сути Контекста, поэтому
  46. сейчас самое время для очень краткого описания: Контекст очень близок
  47. к понятию <a href="https://redux.js.org/introduction/getting-started#basic-example">Store в Redux</a>. К сожалению, на этом месте пояснение заканчиваю,
  48. т.к. без каких-либо весомых доказательств пользы Контекста не готов
  49. обосновывать его применимость. Как только придёт таковое время, так я сразу
  50. расскажу детали.</p>
  51. <p>Теперь вернёмся к генерации Контекста. Вот как выглядит YML Контекста в проекте LHA
  52. (<a href="https://github.com/OGStudio/local-host-access/blob/main/cld/entities.yml">entities.yml</a>):</p>
  53. <pre><code># Application state context
  54. Context:
  55. type: context
  56. fields:
  57. # Command line arguments
  58. arguments: [String]
  59. consoleOutput: String
  60. defaultDir: String
  61. didLaunch: Bool
  62. dir: String
  63. httpDefaultPort: Int
  64. httpLaunch: Bool
  65. httpPort: Int
  66. httpReply: String
  67. httpRequest: NetRequest
  68. </code></pre>
  69. <p>Транслятор CLD преобразует его в следующий код на Kotlin (<a href="https://github.com/OGStudio/local-host-access/blob/main/src/entities.kt#L3">entities.kt</a>):</p>
  70. <pre><code>// Application state context
  71. data class Context(
  72. // Command line arguments
  73. var arguments: Array&lt;String&gt; = arrayOf(),
  74. var consoleOutput: String = "",
  75. var defaultDir: String = "",
  76. var didLaunch: Boolean = false,
  77. var dir: String = "",
  78. var httpDefaultPort: Int = 0,
  79. var httpLaunch: Boolean = false,
  80. var httpPort: Int = 0,
  81. var httpReply: String = "",
  82. var httpRequest: NetRequest = NetRequest(),
  83. override var recentField: String = "",
  84. ): CLDContext {
  85. override fun &lt;T&gt; field(name: String): T {
  86. if (name == "arguments") {
  87. return arguments as T
  88. } else if (name == "consoleOutput") {
  89. return consoleOutput as T
  90. } else if (name == "defaultDir") {
  91. return defaultDir as T
  92. } else if (name == "didLaunch") {
  93. return didLaunch as T
  94. } else if (name == "dir") {
  95. return dir as T
  96. } else if (name == "httpDefaultPort") {
  97. return httpDefaultPort as T
  98. } else if (name == "httpLaunch") {
  99. return httpLaunch as T
  100. } else if (name == "httpPort") {
  101. return httpPort as T
  102. } else if (name == "httpReply") {
  103. return httpReply as T
  104. } else if (name == "httpRequest") {
  105. return httpRequest as T
  106. }
  107. return "unknown-field-name" as T
  108. }
  109. override fun selfCopy(): CLDContext {
  110. return this.copy()
  111. }
  112. override fun setField(
  113. name: String,
  114. value: Any?
  115. ) {
  116. if (name == "arguments") {
  117. arguments = value as Array&lt;String&gt;
  118. } else if (name == "consoleOutput") {
  119. consoleOutput = value as String
  120. } else if (name == "defaultDir") {
  121. defaultDir = value as String
  122. } else if (name == "didLaunch") {
  123. didLaunch = value as Boolean
  124. } else if (name == "dir") {
  125. dir = value as String
  126. } else if (name == "httpDefaultPort") {
  127. httpDefaultPort = value as Int
  128. } else if (name == "httpLaunch") {
  129. httpLaunch = value as Boolean
  130. } else if (name == "httpPort") {
  131. httpPort = value as Int
  132. } else if (name == "httpReply") {
  133. httpReply = value as String
  134. } else if (name == "httpRequest") {
  135. httpRequest = value as NetRequest
  136. }
  137. }
  138. }
  139. </code></pre>
  140. <h1 id="-1">Март</h1>
  141. <p>На текущий момент Kotlin является якорным языком CLD. Для использования
  142. Kotlin необходимо установить соответствующие инструменты Java (Gradle,
  143. Android Studio либо сама JVM). Такое требование делает создание инструмента
  144. разработки чисто для браузера невозможным. Однако, я считаю работу инструмента
  145. разработки в браузере ключевой особенностью для достижения портируемости кода.</p>
  146. <p>Поэтому в марте я планирую создать заготовку инструмента, работающего в браузере.</p>
  147. </div>
  148. </div>
  149. <div id="disqus_thread"></div>
  150. <script>
  151. var disqus_config = function () {
  152. this.page.url = "https://opengamestudio.org/ru/news/cld_ctx-gen.html";
  153. this.page.identifier = "cld_ctx-gen.html";
  154. };
  155. (function() { // DON'T EDIT BELOW THIS LINE
  156. var d = document, s = d.createElement('script');
  157. s.src = 'https://opengamestudio.disqus.com/embed.js';
  158. s.setAttribute('data-timestamp', +new Date());
  159. (d.head || d.body).appendChild(s);
  160. })();
  161. </script>
  162. <noscript>Пожалуйста, включите JavaScript для просмотра <a href="https://disqus.com/?ref_noscript">комментариев на платформе Disqus.</a></noscript>
  163. <div id="footer">
  164. Сайт сгенерирован <a href="http://opengamestudio.org/pskov/ru">ПСКОВОМ</a>
  165. из <a href="http://github.com/ogstudio/site-opengamestudio">этого исходного кода</a>.
  166. </div>
  167. </center>
  168. </body>
  169. </html>