Рубрики
4. Полезняшки Scala

Читерство в NetBeans. Ввод и использования мат. символов и букв греческого алфавита.

Оригинальная идея взята из поста Gabriel's software development blog. Статья довольно старая, опубликована еще в прошлом году .

Если коротко:

def(x:Double)=Math.sqrt(x)
def(r:Range)(f:Int => Int)=r.foldLeft(0)(_+ f(_))
def(r:Range)(f:Int => Int)=r.foldLeft(1)(_* f(_))
val s=(1 to 100)(x=>(x))

Это обычный Scala код! Выглядит он прикольным, потому что мы используем знакомые всем со школы/института символы. Но как сделать так, чтобы было удобно вводить эти символы для меня было загадкой.

В итоге недавно случайно придумал как это можно сделать просто и удобно средствами IDE, а точнее в NetBeans.

Я вбил все нужные мне символы в Code Templates (Tools → Options → Editor → Code Templates) и сделал два макроса для [Alt+<] = "←" и [Alt+>] = "⇒".

Как это работает можно посмотреть здесь:

То есть вы вводите например alpha и жмете [Tab], в результате в код вставляется α. Самое главное, это настраивается только для нужного языка (в частности Scala), таким образом это не мешает в работе с другими языками. Также если вы хотите написать просто alpha, без преобразования, вы просто НЕ нажимайте [Tab] и всё!

Самое главное! Исходники должны быть в UTF-8 (ну или другой юникодной кодировке)!
P.S.: На самом деле вбивать весь греческий алфавит довольно скучное занятие, можно найти файл вроде этого:

C:\Documents and Settings\<USER_NAME>\.netbeans\6.9\config\Editors\text\x-scala\CodeTemplates\org-netbeans-modules-editor-settings-CustomCodeTemplates.xml

и сгенерить туда все аббревиатуры.

Вот пример моего файла - CustomCodeTemplates.zip. Внимание! Это только пример, возможно он Вам не подойдет.
Будьте аккуратны, перед обновлением сделайте резервную копию!

Рубрики
Scala

Магия унарных операторов в Scala (unary_)

Многие знают, что в Scala возможна перегрузка операторов.

К примеру, пусть у нас будет класс - двухмерная точка:

class Point(val x: Double, val y: Double) {
 
  def -(p: Point) = new Point(x-p.x, y-p.y);
  def +(p: Point) = new Point(x+p.x, y+p.y);
 
}

Работать с ней приятно:

   val p1 = new Point(2,2);
   val p2 = new Point(1,1);
   val p = p2 - p1;

Но что делать, если хочется определить унарный минус, т.е. чтобы можно было писать вот так:

   val p = new Point(2,2);
   val antiP = -p;

Конечно, вы можете попробовать сделать так:

    // ТАК ДЕЛАТЬ НЕ НАДО!
    def -() = new Point(-x,-y);

Такой код конечно скомпилируется, но тогда и пользоваться им придется следующим образом:

   val antiP = p-;

Что же делать?

Рубрики
Java Scala

Практикум по программированию на Java и Scala. Занятие №4.

Продолжаю вести практикум по программированию на Java и Scala.

Сегодня было четвертое занятие. Я уже стал многих студентов узнавать в лицо. В среднем на занятия приходит около 25 человек. Аудиторию нам дали хорошую, есть проектор, и вроде неплохие компьютеры. На них уже был установлен Eclipse  или NetBeans.

Рубрики
Scala

For в Scala

Цикл for в Scala.

for ( i < - 1 to 10)  {
     println(i)
}

Что получится в итоге? Здесь все понятно. На консоль будут выведены числа от 1 до 10 включительно.

Как это работает? Здесь немножко сложнее...
Число 1 — это Int, будет неявно преобразован компилятором в тип RichInt.
У RichInt есть метод to(end:Int), который возвращает объект класса Inclusive, который наследуется от класса Range.
Такие объекты замечательны тем, что позволяют нам пробежаться по некоторому диапазону целых чисел с определенным шагом.
То есть наш цикл, аналогичен следующему примеру:

for ( i < - 1.to(10) )  {
     println(i)
}

Кстати, если вы хотите увеличить шаг до двух, вы можете воспользоваться методом to(end: Int, step: Int). Например:

for ( i < - 1 to (10,2) )  {
     println(i)
}

Идем дальше.
Оператор < - является генератором, который присваивает переменной i по-очереди значения из интервала [1,10] с шагом 1.
Как работает этот генератор для цикла for ?
Согласно спецификации языка, происходит следующее:

The translation scheme is as follows. In a first step, every generator p < -e, where p is not irrefutable (§8.1) for the type of e is replaced by p < - e.withFilter { case p => true; case _ => false }
Then, the following rules are applied repeatedly until all comprehensions have been
eliminated.
• A for comprehension for (p < -e ) yield e0 is translated to
e.map { case p => e0 }.
• A for loop for (p < - e ) e0 is translated to e.foreach { case p => e0 }.
...

Таким образом наш цикл, преобразуется к виду:

(1 to 10).foreach {
    case i => println(i)
}

Где для для каждого i выполняется println(i).
Все просто и без императивщины.

Небольшое объявление
Благодаря моему бывшему шефу в аспирантуре и кафедре информатики МФТИ, в следующем учебном году в осеннем семестре будет преподаваться семестровый курс по выбору "ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА JAVA И SCALA". Кому интересно — приходите.

Рубрики
Scala

Опять Scala

Начал формировать небольшой справочник с примерами на Scala для собственного пользования.

Импорт

import java.util.{Date,Calendar}
import java.util.logging._

Простой цикл

for ( x < - 1 to 10)  {
     println(x)
}

Получить класс

classOf[String]
// Например: LoggerFactory.getLogger(classOf[Foo])

Создать список

val x = new scala.collection.mutable.ListBuffer[Int];
x+=1998
x+=2000
x+=2001
x(0)=1999 // изменить элемент

Простой match

val x = "admin";
x match {
     case "admin" => println ("Hello master!");
     case unknown => println("Hello " + unknown);
}

Простой try - catch

try {
      //
      throw new IllegalAccessException("access!")
    } catch {
      case e: IllegalAccessException  =>
        println("IllegalAccess:" + e)
      case e: InstantiationException  =>
        println("Instantiation:" + e)
      case e =>
          // все остальные
          println("Unknown :(" )
    }
Рубрики
1. Языки программирования Scala

Учебное пособие по Scala. Вольный перевод.

В связи с малым количеством (на момент публикации этого поста) полноценных учебных материалов по языку программирования Scala на русском языке , постарался сделать простой перевод краткого пособия.
Оригинальная статья лежит здесь http://www.scala-lang.org/docu/files/ScalaTutorial.pdf
Корректура текста будет осуществляться после публикации, по ходу получения отзывов, комментариев и повторной вычитки. Возможно, через некоторое время выложу PDF-версию.

Scala Tutorial.

Авторы: Michel Schinz, Philipp Haller. Версия 1.3. 15 марта, 2009

Учебное пособие по Scala. Вольный перевод.

Автор перевода: Вит. 30 марта 2010.

Введение

Этот документ дает краткое представление по языку и компилятору Scala. Предполагается, что читатель уже имеет некоторый опыт в программировании и хочет получить представления о том, что он может делать с помощью Scala. Также предполагается, что читатель обладает базовыми знаниями в области объектно-ориентированного программирования, а если быть конкретным -- на языке программирования Java.

Первый пример

В качестве первого пример мы возьмём стандартную программу Hello World. Возможно это не самый обворожительный примерчик, но зато он легко демонстрирует использование Scala и при этом не требует особых знаний самого языка.

object HelloWorld {
    def main(args: Array[String]) {
        println("Hello, world!")
    }
}

Структура такой программы должна быть знакома Java-программистам. Она состоит из main-метода, который получает аргументы командной строки в виде массива строк в качестве параметров. Тело метода состоит из единственного метода println, в качестве аргумента которому передаётся «Hello, World!». Метод main ничего не возвращает, поэтому нет необходимости явно указывать тип возвращаемых данных.

Java программиста может смутить в самом начале слово object в котором содержится main метод.

Рубрики
Без рубрики

Scala и UTF-8

При работе со Scala в Netbeans возникают проблемы с русскими буквами.
Нужно
1. *.scala должны быть в UTF-8
2. в C:\Program Files\NetBeans 6.1\etc\netbeans.conf
добавить к параметру netbeans_default_options значение: -J-Dfile.encoding=UTF-8

Рубрики
Без рубрики

Scala и Netbeans

для того чтобы заработала scala в нетбинсе нужно указать в
"C:\Program Files\NetBeans 6.1\etc\netbeans.conf"

netbeans_default_options= .. -J-Dscala.home=< Путь_к_скале>

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