Scala 2

Mar. 30th, 2006 03:11 pm
lomeo: (лямбда)
[personal profile] lomeo
Вышла Scala 2.
Теперь она поддерживает примитивный двумерный синтаксис:

    def foo(x: int) = {
        val y = x * x
        println("square is " + y)
        y
    }

Появились нормальные for-comprehensions:

    def threeDice = {
        val roll = List.range(1,6)
        for {
            val x <- roll
            val y <- roll
            val z <- roll
            x >= y
            y >= z
        } yield Triple(x,y,z)
    }

Параметры классов теперь можно явно описывать как имеющие только getter (val) или также и setter (var) методы:

class C(x: int, val y: String, var z: List[String])
val c = new C(1, "abc", List())
c.z = c.y :: c.z

Изменениям также подверглись mixins.
Но больше всего мне понравились implicit parameters и flexible typing of pattern matching с case classes, которые позволяют делать на Scala что то вроде Haskell classes и ADT.

Date: 2006-03-31 03:38 am (UTC)
From: [identity profile] http://users.livejournal.com/-lcr-/
Да, действительно интересно. А не знаешь, макросы они принципиально не вводят в язык, или какие-то технические проблемы?

Date: 2006-03-31 07:46 am (UTC)
From: [identity profile] lomeo.livejournal.com
У меня сложилось впечатление, что они почему то считают, что основная задача макров - это создавать новые конструкции для всяких dsl. А эту задачу вполне решают два таких свойства языка как infix/postfix operators и автоматическое конструирование closure.

Вот их пример (реализация loop/unless):

Создаем класс - оболочку для нашей конструкции с методом unless.
Теперь к экземпляру этого класса можно обращаться obj unless cond.

  private class LoopUnlessCond(body: => Unit) {
    def unless(cond: => Boolean): Unit = {
      body
      if (!cond) unless(cond);
    }
  }

Выставляем наружу интерфейс для этого класса, которая, собственно, и выглядит как конструкция.
Теперь obj = loop body будет создавать экземпляр нашего класса.

  def loop(body: => Unit): LoopUnlessCond =
    new LoopUnlessCond(body);

А вот и использовании - здесь ничего уже не торчит и все выглядит как одна конструкция.

  var i = 10;
  loop {
    Console.println("i = " + i)
    i = i - 1
  } unless (i == 0)

Если же мы захотим генерить код во время компиляции - то тут пока ничего нет, к сожалению.
Но я и этому рад - для JVM не так уж много ФЯ есть, а хороших и вообще раз-два и обчёлся.

Date: 2006-03-31 10:37 am (UTC)
From: [identity profile] http://users.livejournal.com/-lcr-/
Хороший пример. И что самое интересное, против фразы "А эту задачу вполне решают два таких свойства языка как infix/postfix operators и автоматическое конструирование closure." и возразить нечего (пока).

Пока всё что приходит на ум укладывается в infix/postfix и closures.

Единственное, что вызывает подозрение, это то, что dsl в принципе могут быть очень извращенскими чтобы уложиться в эту схему.

Вот может быть это:
a < x < b

Обычно конечно разбивают на 3 инфиксных оператора, но ведь это можно мыслить и как тернарный предикат.

То, что для JVM мало хороших ФЯ согласен абсолютно. Прям беда :-)

Date: 2006-03-31 12:21 pm (UTC)
From: [identity profile] lomeo.livejournal.com
Да, в общем то, дело в том, что макры на мой взгляд нужны не для того, чтобы создавать новые конструкции (вернее, это их побочный эффект). А для того, чтобы "писать программы, которые пишут программы", чтобы можно было написать обработку кода, а не данных, которая будет выполняться compile-time.

А так - насчет a < x < b согласен - хороший пример.

А JVM мое больное место в силу специализации :-(

Date: 2006-04-01 07:31 am (UTC)
From: [identity profile] http://users.livejournal.com/-lcr-/
:-)))

% У меня тоже JVM - больное место.

Date: 2006-04-06 04:27 am (UTC)
From: [identity profile] kozodoev.livejournal.com
я вот поставил как-то скалу и через 3 минуты снес. У меня паника начинается при виде ооп вообще, а при виде такого приторного как в скале, так просто истерика:)
ну и там конечно синтаксис тоже этот ...
лучше я буду CL со схемой на JVM пользовать, если вообще конечно придется что-то еще :)

Date: 2006-04-07 07:18 am (UTC)
From: [identity profile] lomeo.livejournal.com
За неимением лучшего...
А где CL на JVM? Я что то такого не встречал.

Date: 2006-04-07 07:22 am (UTC)
From: [identity profile] kozodoev.livejournal.com
http://armedbear.org/abcl.html
и на нем кстати написан хороший текст. редактор
http://armedbear-j.sourceforge.net/

Date: 2006-04-07 07:32 am (UTC)
From: [identity profile] lomeo.livejournal.com
Спасибо!

Profile

lomeo: (Default)
Dmitry Antonyuk

April 2024

S M T W T F S
 123456
7891011 1213
14151617181920
21222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 16th, 2025 04:12 pm
Powered by Dreamwidth Studios