Месяц: Июнь 2011

  • Main args, netbeans

    Пара простых вещей (про аргументы командной строки + Java/Scala и чуть-чуть про NetBeans)

    Самый популярный и набивший оскомину пример HelloWorld встречается, наверное, уже во всех учебниках по программированию:

    // Пример из туториала: http://download.oracle.com/javase/tutorial/getStarted/application/index.html
    class HelloWorldApp {
        public static void main(String[] args) {
            System.out.println("Hello World!"); // Display the string.
        }
    }
    

    Здесь String[] args — аргументы командной строки.
    Например:
    java HelloWorldApp 1 2 означает, что args будет равно {“1”, “2”}.

    Рассмотрим как работать с этими аргументами.
    Если передается всего один аргумент (например, “debug”), то все очень просто — можно подсмотреть пример из туториала: cmdLineArgs.

    В случае, если аргументов много (как в гнусных линуксовых командах), то можно использовать какую-нибудь готовую библиотеку:

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

    В том случае, если аргументы не такие сложные и не слишком простые, а что-то среднее, то тянуть для этих целей дополнительную библиотеку нет никакого смысла. Например, если нужно передать что-то вроде: “-x -size 1024 -v”.
    Обычно это бывает, когда требуется небольшая, почти “одноразовая” программа…

    Многие настолько не любят писать разбор таких аргументов, что лепят все параметры в системные свойства (java … -Dfoo=”some string”), чтобы потом дергать их через System.getProperty().
    Это конечно удобно, но не всегда нормально.

    Проще написать разбор обычными стандартными средствами:

    public class App {
    
        public static void main(String[] args) {
            boolean v = false, x = false;
            int size = 0;     
            for (int i=0;iSnippet: Match Arguments.
    Что-то очень сложное – подключаем сторонние библиотеки для разбора аргументов командной строки (ту же апачевскую или jopt).
    В том случае, если что-то среднее, то можно написать на чистой Scala:

    object App  {
      def main(args:Array[String]) = {
          var v = false; var x = false; var size = 0   
         ("" +: args :+ "") reduceLeft ( (i, j) => {
            i match {
              case "-v"     => v = true
              case "-size"  => size = j.toInt
              case "-x"     => x = true
              case _ =>
            }; j
         })
        println("v =" + v )
        println("x = " + x)
        println("size = " + size)
       }
    }
    

    Пару слов про reduceLeft. По сути этот тот же foldLeft, только начинается с первого элемента коллекции. Подробнее можно почитать в Scala API по работе с коллекциями.

    Про другую известную многим фишку, о которой хотел рассказать — макросы в NetBeans-ах.
    Точнее, про самый популярный макрос - debug-var. Вызывается по нажатию: Ctrl-J D.
    Вообще макросы в нетбинсах есть уже много лет, по-крайне мере, когда я только начинал использовать нетбинс (3.* версии), они уже там были.
    Например, для Scala можно сделать макрос, который будет вставлять в код: println("var=" + var)

    Настроить можно здесь:
    Tools -> Option -> Editor -> Macros

    Про другие полезные макросы можно почитать здесь

  • Немного карри

    Использовать карринг в Scala одно удовольствие.
    Само определение каррирования(или карринга, названо в честь Хаскелла Карри):

    Для функции h типа h : (A × B) → C оператор каррирования Λ выполняет преобразование
    Λ(h) : A → (B → C)

    Отметим, что Λ – это оператор, то есть “функция над функциями”.
    Например берем функцию foo(x,y), каррируем и получаем moo(x)(y) – функцию от x которая возвращает функцию от y. (далее…)