Разработка Clojure: IDE или REPL?

Попробовав разные растворы, я пришел на на этот сайт. Чжоу Юн показывает, как программно расширить все узлы TreeView. В его методе есть две основные идеи:

  • ContainerFromItem будет возвращать контейнер только в том случае, если элемент является прямым потомком элемента. В TreeView это означает, что будет возвращен только дочерний контейнер первого уровня, и вам нужно вызвать ContainerFromItem для дочернего TreeViewItem, чтобы получить контейнер следующего уровня. расширен. Это означает, что для выбора TreeViewItem необходимо развернуть все элементы, предшествующие требуемому элементу. На практике это означает, что нам нужно будет указать путь к элементу, который мы хотим выбрать, а не только к элементу.

Вот код, который я закончил с

public static void SelectItem(this ItemsControl parentContainer, List path)
{
    var head = path.First();
    var tail = path.GetRange(1, path.Count - 1);
    var itemContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(head) as TreeViewItem;

    if (itemContainer != null && itemContainer.Items.Count == 0)
    {
        itemContainer.IsSelected = true;

        var selectMethod = typeof(TreeViewItem).GetMethod("Select", BindingFlags.NonPublic | BindingFlags.Instance);
        selectMethod.Invoke(itemContainer, new object[] { true });
    }
    else if (itemContainer != null)
    {
        itemContainer.IsExpanded = true;

        if (itemContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
        {
            itemContainer.ItemContainerGenerator.StatusChanged += delegate
            {
                SelectItem(itemContainer, tail);
            };
        }
        else
        {
            SelectItem(itemContainer, tail);
        }
    }
}

18
задан clartaq 23 October 2009 в 00:51
поделиться

3 ответа

Я думаю, здесь действительно есть 2 вопроса:

A) как развертывать (и создавать и управлять зависимостями). Все, что я могу сказать по этому поводу, это посмотреть на другие проекты с похожими целями / доменами и скопировать их.

B) Рабочий процесс:

Мой рабочий процесс выглядит следующим образом:

  1. откройте файл и напишите какое-нибудь желаемое на высоком уровне. декларации мышления

  2. начинают писать некоторые функции для его поддержки

2.5 копируют определения функций в REPL по мере их создания

  1. открывают другой файл и пишут некоторые базовые тесты для проверки работы функции

3.5 копируют их в REPL

  1. выполняет итерацию между двумя буферами, создающими тесты до примера, и программой для достижения конечной цели. В конечном итоге это становится похожим действием, и я знаю, что я закончил.

  2. завернуть вторичный файл в deftest

Теперь, когда я вернусь через месяц, я могу просто запустить свои тесты и быть счастливым! Сохранение буферов REPL может принести некоторую пользу без особых усилий. Это как раз то, что у меня работает в настоящее время, и я рад, что меня научили лучше подходить.

Что касается выбора IDE и REPL - у большинства IDE есть плагины с REPL, поэтому я не уверен, что это тот или иной вариант. Другой выбор - на самом деле все зависит от того, в каком текстовом редакторе вы работаете продуктивно и как вы хотите управлять структурой своего проекта. Нет никаких предварительно созданных AFAIK структур «сделай это таким образом», поэтому на этом этапе легче смотреть на конкретные проекты (например, сам Clojure, или penumbra, или compojure, либо любую из библиотек, перечисленных на основном сайте.

]

Что касается выбора IDE или REPL - у большинства IDE есть плагины с REPL, поэтому я не уверен, что это тот или иной выбор - на самом деле все дело в том, в каком текстовом редакторе вы продуктивны и как вы хотите управлять структура вашего проекта. Нет никаких предварительно созданных AFAIK структур «сделай это таким образом», поэтому на этом этапе легче смотреть на конкретные проекты (например, сам Clojure, или penumbra, или compojure, либо любую из библиотек, перечисленных на основном сайте.

]

Что касается выбора IDE или REPL - у большинства IDE есть плагины с REPL, поэтому я не уверен, что это тот или иной выбор - на самом деле все дело в том, в каком текстовом редакторе вы продуктивны и как вы хотите управлять структура вашего проекта. Нет никаких предварительно созданных AFAIK структур «сделай это таким образом», поэтому на этом этапе легче смотреть на конкретные проекты (например, сам Clojure, или penumbra, или compojure, либо любую из библиотек, перечисленных на основном сайте.

]
12
ответ дан 30 November 2019 в 07:44
поделиться

Подход к разработке REPL долгое время поддерживался большинством IDE семейства LISP (и других функциональных языков). Некоторые из этих REPL также имеют функции автозаполнения, которые вы можете ассоциировать с Java IDE.

REPL дает вам несколько основных преимуществ по сравнению со стандартным подходом. Во-первых, он позволяет вам выполнять произвольный код во время выполнения вашей программы, что может значительно упростить отладку многопоточных систем. Во-вторых, что более важно, это упрощает тестирование ваших функций во время написания кода. Вам не нужно строить каркас вокруг новой функции или класса, вы можете поиграть с ним прямо в REPL и посмотреть, как он реагирует на различные варианты использования.

9
ответ дан 30 November 2019 в 07:44
поделиться

Начнем с того, что практически любой достойный плагин разработки для любого редактора или IDE предоставит вам возможность использовать Clojure REPL из среды IDE. Возможно, даже позволят вам загружать файлы в REPL для тестирования и тому подобное. Вам не нужно выбирать то или другое.

Enclojure идет долгим путем, это точно. Однако большинство людей, включая меня, совершенно довольны использованием Emacs. Emacs использует Lisp в качестве языка конфигурации, поэтому обычно это наиболее естественный выбор для Lisper.

Для языков, имеющих REPL, использование REPL в качестве основной части процесса разработки является нормой. Редактирование файлов, загрузка их в REPL, игра с ними на предмет работы, полоскание, повторение. Это одно из основных преимуществ языков с REPL, таких как Clojure, Haskell, CL и т.п.

Что касается создания jar-файлов, компиляции кода Clojure и прочего, это просто. Вы даже не / имеете / для компиляции кода Clojure большую часть времени, если не хотите. Когда вы это делаете, вы AOT компилируете его с помощью gen-class, который компилирует его в файлы классов, которые затем можно поместить в jar. В Интернете можно найти множество примеров и даже руководств. Самый простой и эффективный способ - использовать что-то вроде Ant и написать сценарий сборки, который компилирует код Clojure и генерирует для вас .jar. В первый раз, когда я сделал это, я подумал, что это будет сложно, но на самом деле это было очень просто. Я только что просмотрел файлы сборки Clojure и Clojure-Contrib Ant и сослался на страницы справки Ant для всего остального, что мне было нужно.

Одна вещь, которую я должен упомянуть, это тот факт, что Enclojure / создает / фактически создает исполняемый файл. jar файлы, если вы попросите об этом. Я уверен, что в будущем будут добавлены более продвинутые вещи, к которым вы привыкли. Они действительно еще совсем новые.

6
ответ дан 30 November 2019 в 07:44
поделиться