Какой-либо пример, в котором Clojure действительно сияет против Java, который не является связанным concurrency/immutability-feature?

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

В некоторой категории определяют Ваш метод, который использует Вашу функцию

@implementation BaseClass (SomeCategory)
- (BOOL)myMethod {
    return someComparisonFunction(self, whatever);
}
@end

Тогда везде, где Вы будете фильтровать:

- (NSArray *)myFilteredObjects {
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"myMethod = TRUE"];
    return [myArray filteredArrayUsingPredicate:pred];
}

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

10
задан Brian Carper 8 December 2009 в 05:37
поделиться

3 ответа

Были ли в Java действительно пропущены такие функции, как Мультиметоды, Динамическое связывание, Деструктурирующее связывание?

Да. Также ...

  1. Первоклассные функции. Вкусные первоклассные функции. Это не просто предмет FP. Есть веская причина, по которой люди требуют закрытий в Java 7.

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

  3. Clojure имеет лучший контроль и конструкции цикла, а также возможность создавать свои собственные с помощью макросов и первоклассных функций. В Java есть для и foreach и , в то время как (и даже не было foreach в течение многих лет). Clojure имеет map , filter , reduce , mapcat , много форм do , много if и , когда формируется , перечислить понимания через для и так далее. Если бы их не было, вы могли бы написать их сами. В Java вам придется ждать десять лет, пока комитет (возможно) одобрит такие функции.

  4. За исключением тех, которые имеют дело со статической типизацией, все функции, установленные для Java 7 , Clojure либо уже есть, либо может иметь тривиально. «Автоматическое управление ресурсами», Clojure имеет как with-open . «Языковая поддержка коллекций», Clojure (и Ruby, Perl, Python ...) уже сделал это. «Строки в переключателе», Clojure имеет более мощные конструкции типа case, такие как condp и все, что вы можете придумать. Вы можете написать любой из них самостоятельно в дюжине строк Clojure.

  5. Краткий синтаксис для списков, карт, массивов, наборов, отсортированных наборов, отсортированных карт и т. Д. И почти взаимозаменяемое использование их всех благодаря seq абстракция. Буквальная поддержка регулярных выражений, символов, анонимных функций и т. Д.

  6. В Java есть обязательные проверенные исключения, которые раздражают; Clojure этого не делает.

  7. Синтаксис Java многословен и нерегулярен. Синтаксис Clojure лаконичный и регулярный. Даже Java, написанная на Clojure, часто более лаконична, чем Java, написанная на Java, благодаря таким макросам, как -> и doto , и такие конструкции, как proxy и (скоро) reify .

  8. В Java-коде слишком много обязательного шаблона и бесконечного повторения. public static void main (String [] args) {...} и т. Д. Clojure практически не имеет этого шаблона, при этом почти ничего не жертвуя с точки зрения выразительности или мощности. Даже другие языки со статической типизацией сегодня, похоже, идут по пути вывода типов. Есть веская причина, по которой вам нужна громоздкая Java-ориентированная IDE для написания и бесконечного «рефакторинга» Java-кода; написание этого от руки сведет вас с ума и измотает пальцы до кусков.

  9. В Java все является классом или интерфейсом, независимо от того, должен он быть или нет, что является причиной ненужной сложности. Есть много программ, которые нужно изменить до неузнаваемости, чтобы они соответствовали стилю ООП. Clojure позволяет этого избежать. Хорошая напыщенная речь на этот счет. Clojure в основном фокусируется на глаголах.

  10. Интерактивное программирование с помощью REPL - это весело. Циклов компиляции / запуска / отладки нет. Clojure по-прежнему компилируется в файлы .class, если вы этого хотите; тем временем вы можете сидеть в середине кода и свободно возиться, пока он выполняется.

  11. С метаданными Clojure и нормальным тестированием на равенство приятно работать. Так же, как и его автоматическое продвижение int до long в Bigint, собственная обработка рациональных чисел и т. Д.

  12. Динамическая типизация приводит к более короткому, более универсальному, следовательно, более многократно используемому и более мощному коду, чем статическая типизация. (Это, разумеется, весьма спорный момент, поэтому я ставлю его напоследок.)

Популярность Scala, Groovy, JRuby и Jython, а также бесконечного количества других JVM-языков, которые-aren '

25
ответ дан 3 December 2019 в 14:24
поделиться

Ну, во-первых, в Clojure обычно намного меньше "церемоний". Такие языки, как Python и Ruby, также имеют это преимущество перед Java (отсюда и популярность JRuby, Jython).

Но обратите внимание, что бывают случаи, когда в Java невозможно избежать многословности, хотя здесь может быть четкая закономерность. Макросы Clojure являются здесь огромным преимуществом - даже по сравнению с другими столь же динамическими языками.

Еще одна вещь, которую следует учитывать, - это то, что программы Clojure обычно безопасны для параллелизма. Так что, если в будущем вы решите сделать конкретное приложение параллельным, это не будет слишком болезненно. Без принятия множества предварительных решений с Java сделать это будет значительно труднее.

Также интересно, будет ли Clojure иметь явное преимущество перед Java, если в нем отсутствуют сильные примитивы параллелизма и неизменяемость - это все равно что сказать: «

2
ответ дан 3 December 2019 в 14:24
поделиться

Брайан очень хорошо обобщено. Вот что-то, что действительно поразило меня. (Из книги программирование Clojure Stuart Halloway)

Java Code, из Apache Commons:

public class StringUtils {
    public static boolean isBlank(String str) {
        int strLen;
        if (str == null || (strLen = str.length()) == 0) {
            return true;
        }
        for (int i = 0; i < strLen; i++) {
            if ((Character.isWhitespace(str.charAt(i)) == false)) {
                return false;
            }
        }
        return true;
    }
}

Вот аналогичная реализация в Clojure:

(defn blank? [s] (every? #(Character/isWhitespace %) s))
7
ответ дан 3 December 2019 в 14:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: