Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

168 рядки
7.7KB

  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/ctx-gen.html">EN</a>
  19. <a href="../../ru/news/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="ctx-gen.html">Генерация Контекста из YML</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/??.png" alt="splash" /></p>
  35. <h1 id="">Генерация Контекста</h1>
  36. <p>В феврале доработал конвертер межъязыкового диалекта для генерации
  37. Контекста на основе описания в YML и уже применил его для проектов
  38. Local Host Access, самого конвертера, ПСКОВа.</p>
  39. <p>Если очень кратко, то Контекст представляет из себя полное состояние
  40. приложения, по сути аналог <a href="https://redux.js.org/introduction/getting-started#basic-example">store в Redux</a>.</p>
  41. <p>Для примера возьмём описание Контекста из Local Host Access
  42. (<a href="https://github.com/OGStudio/local-host-access/blob/main/cld/entities.yml">entities.yml</a>):</p>
  43. <pre><code># Application state context
  44. Context:
  45. type: context
  46. fields:
  47. # Command line arguments
  48. arguments: [String]
  49. consoleOutput: String
  50. defaultDir: String
  51. didLaunch: Bool
  52. dir: String
  53. httpDefaultPort: Int
  54. httpLaunch: Bool
  55. httpPort: Int
  56. httpReply: String
  57. httpRequest: NetRequest
  58. </code></pre>
  59. <p>Конвертер преобразует его в следующий код на Kotlin (<a href="https://github.com/OGStudio/local-host-access/blob/main/src/entities.kt#L3">entities.kt</a>):</p>
  60. <pre><code>// Application state context
  61. data class Context(
  62. // Command line arguments
  63. var arguments: Array&lt;String&gt; = arrayOf(),
  64. var consoleOutput: String = "",
  65. var defaultDir: String = "",
  66. var didLaunch: Boolean = false,
  67. var dir: String = "",
  68. var httpDefaultPort: Int = 0,
  69. var httpLaunch: Boolean = false,
  70. var httpPort: Int = 0,
  71. var httpReply: String = "",
  72. var httpRequest: NetRequest = NetRequest(),
  73. override var recentField: String = "",
  74. ): CLDContext {
  75. override fun &lt;T&gt; field(name: String): T {
  76. if (name == "arguments") {
  77. return arguments as T
  78. } else if (name == "consoleOutput") {
  79. return consoleOutput as T
  80. } else if (name == "defaultDir") {
  81. return defaultDir as T
  82. } else if (name == "didLaunch") {
  83. return didLaunch as T
  84. } else if (name == "dir") {
  85. return dir as T
  86. } else if (name == "httpDefaultPort") {
  87. return httpDefaultPort as T
  88. } else if (name == "httpLaunch") {
  89. return httpLaunch as T
  90. } else if (name == "httpPort") {
  91. return httpPort as T
  92. } else if (name == "httpReply") {
  93. return httpReply as T
  94. } else if (name == "httpRequest") {
  95. return httpRequest as T
  96. }
  97. return "unknown-field-name" as T
  98. }
  99. override fun selfCopy(): CLDContext {
  100. return this.copy()
  101. }
  102. override fun setField(
  103. name: String,
  104. value: Any?
  105. ) {
  106. if (name == "arguments") {
  107. arguments = value as Array&lt;String&gt;
  108. } else if (name == "consoleOutput") {
  109. consoleOutput = value as String
  110. } else if (name == "defaultDir") {
  111. defaultDir = value as String
  112. } else if (name == "didLaunch") {
  113. didLaunch = value as Boolean
  114. } else if (name == "dir") {
  115. dir = value as String
  116. } else if (name == "httpDefaultPort") {
  117. httpDefaultPort = value as Int
  118. } else if (name == "httpLaunch") {
  119. httpLaunch = value as Boolean
  120. } else if (name == "httpPort") {
  121. httpPort = value as Int
  122. } else if (name == "httpReply") {
  123. httpReply = value as String
  124. } else if (name == "httpRequest") {
  125. httpRequest = value as NetRequest
  126. }
  127. }
  128. }
  129. </code></pre>
  130. <h1 id="-1">Проблемы</h1>
  131. <p>Тем не менее, на текущий момент ощутил огромный минус Котлина для
  132. проекта CLD - необходимость оригинального компилятора Котлин, т.к.
  133. без него я не могу валидировать код. Могу транслировать, но не валидировать.
  134. Выходит, я не смогу написать чисто браузерный транслятор, чтобы в браузере
  135. писать Котлин, а он чтобы мне выдавал, скажем, Питон, т.к. в этом случае
  136. я в браузере не могу проверить ни Котлин, ни Питон.</p>
  137. <p>Поэтому в марте я рассмотрю возможность использования всё-таки чистого
  138. JavaScript в качестве якорного языка для CLD, хоть в JS и не строгой типизации,
  139. зато браузер уже содержит компилятор JS.
  140. А типы можно комментом ведь написать!</p>
  141. <h1 id="-2">Март</h1>
  142. <p>В марте начну создание нового инструмента для решения своих
  143. хобби-задач на основе Isomorphic-Git.</p>
  144. </div>
  145. </div>
  146. <div id="disqus_thread"></div>
  147. <script>
  148. var disqus_config = function () {
  149. this.page.url = "https://opengamestudio.org/ru/news/ctx-gen.html";
  150. this.page.identifier = "ctx-gen.html";
  151. };
  152. (function() { // DON'T EDIT BELOW THIS LINE
  153. var d = document, s = d.createElement('script');
  154. s.src = 'https://opengamestudio.disqus.com/embed.js';
  155. s.setAttribute('data-timestamp', +new Date());
  156. (d.head || d.body).appendChild(s);
  157. })();
  158. </script>
  159. <noscript>Пожалуйста, включите JavaScript для просмотра <a href="https://disqus.com/?ref_noscript">комментариев на платформе Disqus.</a></noscript>
  160. <div id="footer">
  161. Сайт сгенерирован <a href="http://opengamestudio.org/pskov/ru">ПСКОВОМ</a>
  162. из <a href="http://github.com/ogstudio/site-opengamestudio">этого исходного кода</a>.
  163. </div>
  164. </center>
  165. </body>
  166. </html>