2016-12-14 5 views
2

На момент написания этой статьи CLJX не работает в Clojure/Clojurescript, заменив CLJC, так что this question больше не имеет полезных ответов.Канонический способ использования кода clojure в clojurescript

Итак, вот удар по каноническому вопросу: Как вы используете код Clojure в ClojureScript из того же проекта?

Из моих исследований до сих пор, у меня сложилось впечатление, есть три типа Clojure/Clojurescript файлов:

  • CLJ: Pure Clojure
  • CLJC: "Условно" Clojure/ClojureScript
  • CLJS : Чистый Clojurescript

Кроме того, есть two ways of bringing in Clojure code к CLJS вызова:

  • Предварительно вычисляемые макросы
  • Читатель условными

ли эти "как" способы сделать это? Как они выглядят на сторонах CLJ/CLJS?

ответ

2

Это по существу правильно. Если ваш код находится в файле .cljc, вы можете просто потребовать это пространство имен и использовать функции, обычно используемые в файле .cljs (так же, как если бы это был файл .cljs). Если .cljc имеет различия clj/cljs, они могут быть закодированы с использованием условий чтения в файле .cljc.

Или вы можете определить макросы в файле .clj, а затем потребовать и вызывать это из вашего .cljs-файла.

0

Это не так и ответ. Я собирался поставить комментарий, но он слишком долгое время. Я думаю, что ваша мотивация здесь хороша, но я не уверен в терминологии. Не имеет смысла говорить об использовании кода clojure в clojurescript. Существует язык, clojure, диалект lisp. Он имеет разные реализации. «оригинал» реализован поверх Java и JVM, один реализован поверх Javascript и один реализован поверх CLR (и других). Код во всех них - clojure (диалект).

Если у вас есть язык, который реализован на разных платформах, вы получите некоторые различия в платформе. Общим примером является преобразование строки в целое число. В clojure на основе JVM вы используете объект Java Integer для синтаксического анализа строки и возврата в целочисленный объект. На платформе Javascript вы вызываете стандартный метод javascript (js) parsInt.

Если вы хотите написать только одну функцию, которая будет работать на обеих платформах, вы должны поместить ее в файл cljc и использовать условия для чтения, чтобы изолировать различия в платформе внутри функции. и ваш colure, и ваш clojurescript будут загружать этот файл cljc, и оба будут иметь функцию с тем же именем и api.

Тем не менее, существует множество других более тонких несоответствий между платформами. например, примитивы параллелизма и такие вещи, как расшифровка протоколов и т. д.

В действительности, вы не можете запустить код clojure в clojurescirpt. Однако из-за общего синтаксиса на диалектах вы можете иметь ситуации, когда ваш clojure cocde и ваш код clojurescript «выглядят» одинаково и могут компилироваться и выполняться под любым диалектом.

При написании прорама, который использует как clojure, так и clojurescript, когда у вас есть код, который выглядит идентичным, вы действительно не хотите писать его дважды, и вы, конечно же, не хотите, чтобы его поддерживали две версии. По возможности вам нужна одна версия, которая может быть включена как в вашу clojure, так и в ваш clojurescript. Общим примером могут служить библиотеки проверки данных. Вы хотели бы иметь тот же код проверки, который используется как для сервера, так и для clent, и вы хотите поддерживать только один набор источников.

На этом этапе я думаю, что самый простой способ сделать это - просто включить этот общий код в файл cljc, даже если defn не содержит никаких условий для чтения. Тем не менее, вы все равно хотите сохранить это до минимума - только определения, которые должны быть разделены между ними.

Концепция не в том, что ваш код clojure работает в clojurescript - вы не можете этого сделать. То, что вы делаете, - это определение кода с использованием диалоги clojure и помещение его в файл с расширениями cljc, которые могут быть включены в процессы клоуризации и clojurescript. Код будет скомпилирован как в байт-код JVM, так и в javascript и будет запущен в любой среде.

Одно из незначительных осложнений с макросами ClojureScript. В clojureScript, в отличие от clojure, макросы должны быть в другой единице компиляции, что означает, что они должны быть в другом файле для вашего другого кода ClojureScript. Это происходит потому, что они сначала расширяются. Они могут находиться в одном пространстве имен, поэтому вы могли бы иметь mycode.cljs и mycode.cljc, например. Вы не можете смешивать свой обычный код ClojureScirpt и макросы ClojureScript в том же файле, что и это означает, что он находится в одном модуле компиляции.

+0

Это хороший ответ, но ответ Алекса также упоминает макросы. Если вы обратитесь к использованию макросов, я приму это. Благодаря! –

+0

ОК, добавлено немного о сохранении макросов в отдельной единице компиляции. –

Смежные вопросы