LINUX.ORG.RU

Предварительный релиз Ruby 1.9.0


0

0

Matz, автор языка Ruby, выпустил предварительный релиз Ruby 1.9.0, следующей версии языка программирования Ruby.

Дистрибутивы: ftp://ftp.ruby-lang.org/pub/ruby/1.9

Вот подборка с описанием отличий Ruby 1.9 от предшествующего Ruby 1.8: http://eigenclass.org/hiki/Changes+in...

>>> Подробности

Ответ на: комментарий от tailgunner

> Единственное, что ты (почти) продемонстрировал - более мощная лямбда в Руби.

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

Burbaka ★★
()
Ответ на: комментарий от anonymous

реквестирую текст-онли негров в этот тред

алсо руби сасёт

anonymous
()
Ответ на: комментарий от halflife

Звучит неплохо. Но реально ли нужно это всё на практике?

Даст Бог, когда нибудь и столкнусь с Руби в живую. Кстати, почем нынче виртуальный хостинг Руби? :)

DOKA
()
Ответ на: комментарий от cathode

> Ну прям-таки "только".

Ну да, еще есть вариант с копипастом

Burbaka ★★
()
Ответ на: комментарий от eao197

>Итераторы вообще не причем.

Ну ты-то мог бы и прочитать нашу с Burbaka беседу сначала...

>"Общеизвестно, что самая классная часть руби - итераторы. В питоне итераторы гораздо более убогие."

>Burbaka * (*) (26.12.2007 14:36:49)

Вот на эту фразу я отвечал, а всё (в который раз) свелось к тому. что в Питоне ущербная лямбда.

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

Ну если _это_ DSL, тогда конечно.

tailgunner ★★★★★
()
Ответ на: комментарий от cathode

>>> Итераторы вообще не причем.

> Вот именно, а товарищь свалил все в кучу.

Может он только учится.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от Burbaka

>> Зачет этого не нужны синтаксические заморочки с анонимными функциями.

Здрасть... А как же тот пример тогда? Там же в качестве условия анонимная функция (только называется она блок кода). А в остальном там генератор такой-же как и в питоне, тот же йелд с теми же вытеакющими, только фильтр ему передается из вне в виде блока кода.

cathode
()
Ответ на: комментарий от Burbaka

> Это не лямбда.

Не вижу существенной разницы между блоком кода и лямбдой

> Это именно итератор/генератор (правильное выбрать, грань настолько зыбкая что непонятно).

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

> Зачет этого не нужны синтаксические заморочки с анонимными функциями.

Но нужны "синтаксические заморочки" с блоками кода. Практической разницы не ухватываю.

tailgunner ★★★★★
()
Ответ на: комментарий от eao197

Согласен, блоки вообще мощная штука, но для организации разного рода циклических процессов они рулят неимоверно. Именно на этом хотел заострить внимание

Burbaka ★★
()
Ответ на: комментарий от tailgunner

>>Итераторы вообще не причем.

>Ну ты-то мог бы и прочитать нашу с Burbaka беседу сначала...

К сожаленью, здесь не очень удобная форма следования сообщений, поэтому в общем потоке сообщений я мог и потерять что-нибудь. Звиняйте, еже ли чего.

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

> Ну если _это_ DSL, тогда конечно.

Мне слышится ирония в твоих словах или я ошибаюсь? ;)

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

>> Ну если _это_ DSL, тогда конечно.

> Мне слышится ирония в твоих словах или я ошибаюсь? ;)

Ты не ошибаешься. Я не считаю приведенное DSLanguage - всего лишь DSLibrary.

Кстати, в Питоне есть и инструменты для создания реальных DSLanguage 8) EasyExtend, например.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>>> Ну если _это_ DSL, тогда конечно.

>> Мне слышится ирония в твоих словах или я ошибаюсь? ;)

> Ты не ошибаешься. Я не считаю приведенное DSLanguage - всего лишь DSLibrary.

Тогда тебе нужно почитать Фаулера по поводу DSL (например, http://www.martinfowler.com/dslwip/ -- здесь хорошее введение). DSL-и ведь делятся на external (которые имеют собственный синтаксис) и internal (которые реализуются благодоря средствам самого языка).

Lisp-ы или, скажем, Nemerle, являются мощными инструментами для создания internal DSL за счет того, что позволяют пользователю изменять или добавлять в язык новые синтаксические конструкции.

Ruby или Scala позволяют делать internal DSL-и за счет свойств своего синтаксиса. Т.е. новых синтаксических конструкций в язык не добавить, но зато существующий достаточно гибок, чтобы создавать иллюзию нового языка.

А external DSL -- это совсем другая пестня.

eao197 ★★★★★
() автор топика

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

anonymous
()
Ответ на: комментарий от eao197

>> Ты не ошибаешься. Я не считаю приведенное DSLanguage - всего лишь DSLibrary.

> Тогда тебе нужно почитать Фаулера по поводу DSL

Я читал. Его термин "internal DSL" просто бессмысленен. Часть того, что называется этим термином, вообще не следует называть языком - иначе сам термин "язык" становится бессмысленным, и даже библиотеку на Фортране можно назвать "языком".

> Ruby или Scala позволяют делать internal DSL-и за счет свойств своего синтаксиса. Т.е. новых синтаксических конструкций в язык не добавить

Нет новых синтаксических конструкций - значит, нет нового языка. Всё просто.

tailgunner ★★★★★
()

что-то купил я книжку по рубби читаю и не нравится он мне. жуткая ориентация на ООП что аж тошновато

xargs ★★★
()
Ответ на: комментарий от tailgunner

>Нет новых синтаксических конструкций - значит, нет нового языка. Всё просто.

+много. Шо поражает так это вот такой подход когда каждый корежит устоявлиеся понятия как хочет. Тут уже блоки кода не "лямбды" (хоть бы уже замыкания написали). DSLи появились обычным вменяемым именованием методов. Сколько можно давать колесу свои собственные названия, и обзывать колесом то что им не является?

r ★★★★★
()
Ответ на: комментарий от cathode

Блок функцией не является. Хотя так может и казаться непосвященному человеку.

class Array def how_many? count = 0 for i in 0...size value = self[i] count = count +1 if yield(value) end return count end end

x = [1,2,0,4,5].how_many? do |x| next if x == 0 x % 2 == 0 end

print x

Burbaka ★★
()
Ответ на: комментарий от cathode

Блок функцией не является. Хотя так может и казаться непосвященному человеку. 

class Array 
 def how_many?
   count = 0 
   for i in 0...size 
     value = self[i]
     count = count +1 if yield(value) 
   end 
   return count 
 end 
end 

x = [1,2,0,4,5].how_many? do |x| 
    next if x == 0	
    x % 2 == 0
end 

print x

Burbaka ★★
()
Ответ на: комментарий от r

>>Нет новых синтаксических конструкций - значит, нет нового языка. Всё просто.

>+много. Шо поражает так это вот такой подход когда каждый корежит устоявлиеся понятия как хочет. Тут уже блоки кода не "лямбды" (хоть бы уже замыкания написали).

Code blocks -- это устоявшийся термин в Ruby community. У SmallTalk-еров они так же не лямбдами называются.

Вообще-то лямбды -- это функции, а блоки кода в Ruby это объекты. И, в отличии от лямбды/замыкания, для блока кода можно подменить контекст, на котором он будет исполняться.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от r

> Нет новых синтаксических конструкций - значит, нет нового языка. Всё просто.

Это не так. Пример - лисп с огромным количеством используемых там DSL. Синтаксис там не меняется, все теже s-выражения.

Burbaka ★★
()
Ответ на: комментарий от Burbaka

> Блок функцией не является. Хотя так может и казаться непосвященному человеку.

Ну так объясни, в чем разница. А то приводишь специфические рубиновые конструкции, и делаешь какие-то непонятные выводы.

tailgunner ★★★★★
()
Ответ на: комментарий от xargs

>что-то купил я книжку по рубби читаю и не нравится он мне. жуткая ориентация на ООП что аж тошновато

интересно что же можно ожидать от книги по ооп-языку. мулаток и кокса?)

volh ★★
()
Ответ на: комментарий от Burbaka

>> Нет новых синтаксических конструкций - значит, нет нового языка. Всё просто.

> Это не так. Пример - лисп с огромным количеством используемых там DSL. Синтаксис там не меняется

О Лиспе я ничего не говорил, ибо Лисп ниасилил. Но в Схеме есть конструкция define-syntax. Она, по-твоему, нового синтаксиса не определяет? :D

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Пример иллюстрирует простую вешь, когда блоки используются в качестве итераторов/генераторов они поддерживают конструкции управления циклами. next, redo, break и т.д. Также как было отмечено блоки могут выполняются в контексте классов, а не функций, в которых они были созданы. Очень удобно при разработке DSL.

Burbaka ★★
()
Ответ на: комментарий от tailgunner

> О Лиспе я ничего не говорил, ибо Лисп ниасилил. Но в Схеме есть конструкция define-syntax. Она, по-твоему, нового синтаксиса не определяет? :D

Насколько знаю схему, то define-syntax синтаксис языка как раз таки не меняет. Синтаксические правила остаются теми же.

Burbaka ★★
()
Ответ на: комментарий от tailgunner

>>> Ты не ошибаешься. Я не считаю приведенное DSLanguage - всего лишь DSLibrary.

>> Тогда тебе нужно почитать Фаулера по поводу DSL

> Я читал. Его термин "internal DSL" просто бессмысленен. Часть того, что называется этим термином, вообще не следует называть языком - иначе сам термин "язык" становится бессмысленным, и даже библиотеку на Фортране можно назвать "языком".

Ты забываешь, что это не просто язык, а Domain Specific Language. Т.е. это "язык", максимально приближенный к предметной области. И он должен оцениваться по тому, насколько близко он к этой области приближается и насколько много/мало "синтаксического оверхеда" при этом содержит. А вовсе не потому, насколько он отличается от своего host-языка.

>> Ruby или Scala позволяют делать internal DSL-и за счет свойств своего синтаксиса. Т.е. новых синтаксических конструкций в язык не добавить

> Нет новых синтаксических конструкций - значит, нет нового языка. Всё просто.

Хорошая точка зрения :) Понятная. Только когда создашь и попользуешься сам несколькими internal DSL-ями, то ее уже не разделяешь. Поскольку подход к разработке internal DSL несколько отличается от разработке обычного API.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от Burbaka

В общем, единственное отличие от "обычной" лямбды - это возможность использования break и прочих инструкций управления циклами. Интересная деталь реализции, но не более. И насколько часто в блоках кода используется break?

tailgunner ★★★★★
()
Ответ на: комментарий от eao197

> Ты забываешь, что это не просто язык, а Domain Specific Language. Т.е. это "язык", максимально приближенный к предметной области.

Я об этом не забываю.

> И он должен оцениваться по тому, насколько близко он к этой области приближается и насколько много/мало "синтаксического оверхеда" при этом содержит.

Он должен оцениваться и по этому критерию тоже, я разве с этим спорю?

> А вовсе не потому, насколько он отличается от своего host-языка.

Если он не отличается от своего хост-языка, то почему он вообще называется "языком", а не "библиотекой"?

Альтернативно, вообще _всё_ программирование - это создание DSL-ей, и сам термин мгновенно обесценивается.

> когда создашь и попользуешься сам несколькими internal DSL-ями

См. выше 8)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> В общем, единственное отличие от "обычной" лямбды - это возможность использования break и прочих инструкций управления циклами.

Еще варируемый контекст выполнения. Пример тут http://blog.jayfields.com/2006/07/ruby-block-scope.html

> И насколько часто в блоках кода используется break?

Зависит от ситуации. Часто ты пользуешься break, continue в Си и Си++ ?

Burbaka ★★
()
Ответ на: комментарий от tailgunner

>> Блок функцией не является. Хотя так может и казаться непосвященному человеку. 

> Ну так объясни, в чем разница. А то приводишь специфические
> рубиновые конструкции, и делаешь какие-то непонятные выводы.

Блок кода в Ruby -- это объект типа Proc 
(http://www.ruby-doc.org/core/classes/Proc.html). Который создается:
- либо неявно при передаче блока кода в функцию:
  5.times { |i| ... } # Здесь {} -- неявно преобразуется в Proc
- либо явно создается с помощью методов proc и lambda:
  b = proc { puts "hello" }
  l = lambda { puts "hello" }
(в Ruby 1.9 появился еще один способ записи: -> { puts 'hello' }
синтаксис, конечно, странный. Японцы, однако, они и пишут иероглифами).

Как любой объект, Proc-объект обладает набором методов. Но это не суть.

Одна из особенностей Proc-объекта в том, что по умолчанию он
сохраняет связь с контекстом, в котором создан. Но, при необходимости,
этот контекст можно сменить при помощи Object#instance_eval
(http://www.ruby-doc.org/core/classes/Object.html#M000336).
Т.е. можно создать блок кода на одном контексте, а применить для
другого.

Другая особенность в том, что когда блок кода передается неявным
аргументом в метод, то тогда можно использовать специальные языковые
конструкции: проверку block_given? (http://www.ruby-doc.org/core/classes/Kernel.html#M005949)
и yield для передачи управления этому блоку.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от r

>> Тут уже блоки кода не "лямбды" (хоть бы уже замыкания написали)

Лямбда в общем случае с замыканием ничего общего не имеет. Хотя замыкание можно реализовать и при помощи лямбд, но не обязательно.

cathode
()
Ответ на: комментарий от Burbaka

>> И насколько часто в блоках кода используется break?

> Зависит от ситуации. Часто ты пользуешься break, continue в Си и Си++ ?

continue - очень редко, и обычно жалею о каждом использовании 8) break - довольно часто, но берусь эмулировать break в блоке кода raise'ом в лямбде/вложенной функции.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> В Basic одна строка - один оператор. И ничего - меньше точек с запятой и прочей быдло-пунктуации. В питоне тоже самое.

Информация неверна. Даже в бейсике Радио-86РК в одной строке были возможны несколько операторов, разделенных двоеточием.

xintrea
()
Ответ на: комментарий от tailgunner

> Если он не отличается от своего хост-языка, то почему он вообще называется "языком", а не "библиотекой"?

internal DSL это всегда библиотека хостового языка программирования. Конструкции internal DSL являются конструкциями хостового языка программирования, просто их семантика подогнана под язык предметной области. Называть это можно как угодно, главное чтобы суть не менялась.

Burbaka ★★
()
Ответ на: комментарий от eao197

>> Вообще-то лямбды -- это функции, а блоки кода в Ruby это объекты. И, в отличии от лямбды/замыкания, для блока кода можно подменить контекст, на котором он будет исполняться.

Если речь идет по прежнему в контексте Ruby vs Python то лямбда в питоне тоже объект (как и все остальное). Собственно говоря основной плюс от лямбд - это возможность исполнять их в различных контекстах, например передавая как параметры в разные функции. Так что увы и ах. А вот, что касается замыкания, то тут речь может идти о конетксте куда замыкание передано и о контексте где оно создано. Первое подменяется как и у лямбд, второе нет.

Code Blocks в руби отличается то питоновских лямбд, тем что блоки кода, говоря в терминах питона это в общем случае утверждение (statement, например типа a=3), а лямбда это выражение (expression, например a+b). Поэтому в питоновскую лямбду нельза впихнуть if, for, def и проч.

cathode
()
Ответ на: комментарий от tailgunner

> continue - очень редко, и обычно жалею о каждом использовании 8)

А я использую часто. И достаточно эффективно.

> break - довольно часто, но берусь эмулировать break в блоке кода raise'ом в лямбде/вложенной функции.

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

Burbaka ★★
()
Ответ на: комментарий от tailgunner

>> А вовсе не потому, насколько он отличается от своего host-языка. 

> Если он не отличается от своего хост-языка, то почему он вообще
> называется "языком", а не "библиотекой"? 

Потому, что:
- подходы к созданию библиотеки и языка;
- использование библиотеки и языка
существенно отличаются.

Когда ты проектируешь библиотеку, тебе безразличен синтаксис языка и
его особенности. Когда проектируешь internal DSL, то ты вынужден
уделять этому певостепенное внимание.

Вот подход на основе библиотеки:

  defines = []
  defines << { 'EXPORT_SPEC' => 'C' }
  defines << { 'EXPORT_CLASS(C)' => 'C' }
  doxygen = new DoxygenTask
  doxygen.include_path( 'my_prj' )
  doxygen.include_samples( 'my_samples' )
  doxygen.defines( defines )
  define_new_task( doxygen )

и сравни с тем, что я приводил раньше.

> Альтернативно, вообще _всё_ программирование - это создание DSL-ей,
> и сам термин мгновенно обесценивается.

Не согласен. Имхо, создание DSL-ей (будь то internal, будь то externals)
и программирование на DSL отличается от записи решения в виде
последовательности обычных вызовов методов/функций.

Возможно, дело в том, что DSL-и пытаются повысить уровень декларативности
и выразительности решения по сравнению с host-языком.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

>Code blocks -- это устоявшийся термин в Ruby community

И что - тут есть чем гордится?

>Вообще-то лямбды -- это функции, а блоки кода в Ruby это объекты.

С ума сойти!

r ★★★★★
()
Ответ на: комментарий от cathode

> Если речь идет по прежнему в контексте Ruby vs Python

Нет, мне такое противопоставление не интересно (LOR вообще единственное из известных мне мест, где Rubyist-ы с Python-щиками воюют). Я просто хочу, чтобы у читателей складывалось более объективное мнение о Ruby.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от cathode

> Если речь идет по прежнему в контексте Ruby vs Python то лямбда в питоне тоже объект (как и все остальное). Собственно говоря основной плюс от лямбд - это возможность исполнять их в различных контекстах ...

Блок может быть создан внутри функции, но при этом иметь контекст объявления - класс. См. пример выше.

> Code Blocks в руби отличается то питоновских лямбд, тем что блоки кода, говоря в терминах питона это в общем случае утверждение (statement, например типа a=3), а лямбда это выражение (expression, например a+b). Поэтому в питоновскую лямбду нельза впихнуть if, for, def и проч.

Блоки могут быть и выражениями. Руби вообще не проводит четкой границы между statements и expression.

Burbaka ★★
()
Ответ на: комментарий от Burbaka

> Скорее всего твое решение будет работающей не во всех случаях, синтаксически избыточной полумерой

"Синтаксически избыточной" - возможно, "не всегда работающей" - ерунда, любая разумная реализация break в блоке кода будет использовать механизм, аналогичный исключениям, или даже сам механизм исключений.

> Руби как раз придуман так, чтобы людям было _удобно_ программировать.

Когда я выбирал скриптовый язык, я подумал, что у Руби легкая форма kitchen sink syndrome. Рад, что тебе этот синдром нравится.

tailgunner ★★★★★
()
Ответ на: комментарий от eao197

>Поскольку подход к разработке internal DSL несколько отличается от разработке обычного API.

Чем?

r ★★★★★
()
Ответ на: комментарий от r

>>Code blocks -- это устоявшийся термин в Ruby community

> И что - тут есть чем гордится?

Гордится -- хз А вот придерживаться _устоявшейся_ терминологии при разговоре о Ruby смысл есть. Обзывание блоков кода в Ruby другими терминами как раз и есть ненужное выдумывание терминов.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

>Блок кода в Ruby -- это объект типа Proc

Я лично все еще не увидел почему это не обычная кложура.

r ★★★★★
()
Ответ на: комментарий от Burbaka

>internal DSL это всегда библиотека хостового языка программирования.

Почему _любая_ библиотека тогда не internal DSL?

r ★★★★★
()
Ответ на: комментарий от r

>>Поскольку подход к разработке internal DSL несколько отличается от разработке обычного API.

>Чем?

Тем, что базируется на второстепенных особенностях языка. Таких, например, как необязательность скобок при вызове метода, необязательность скобок при объявлении Hash-литералов, специальном приведении набора аргументов к экземпляру Array и пр.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

>А вот придерживаться _устоявшейся_ терминологии при разговоре о Ruby смысл есть.

Так это и было возражением - что каждый клепатель языка начинает изобретать слова.

r ★★★★★
()
Ответ на: комментарий от eao197

>Тем, что базируется на второстепенных особенностях языка. Таких, например, как необязательность скобок при вызове метода, необязательность скобок при объявлении Hash-литералов, специальном приведении набора аргументов к экземпляру Array и пр.

В вышеупомянутотй статье Файлер делает его на жабе.

Дальше что?

То что ты сказал не имеет под собой никакого основания - DSL - это определенный _мной_ язык, а не возможность звать методы без мусорных скобок.

r ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.