LINUX.ORG.RU

Как переназначить операторы if в ruby

 


0

3

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

 CASE WHEN true THEN 
p 'true' 
ELSE 
p'false' 
END

Пробовал с помощью вызова eval и lambda, но именно if и end подставлять в код они не хотят. Подскажите как можно решить такую задачу.

В с++ я так понимаю есть #define который просто вставляет свой участок кода, а в Руби такой есть?

В с++ я так понимаю есть #define который

…не нужно использовать в целях построения нового языка из C++.

Deleted
()

Ты хочешь макросы в Руби? Нету их. Синтаксические конструкции конечно можно эмулировать с помощью блоков, но вот сделать полноценный if с множественными ветками не получится. Вот в тикле можно такое.

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

Жалко, что в языке, в котором можно переназначить практически все, нельзя это делать с операкторами

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

Например, реализация try...finally на чистом тикле. Там же всё - строки, а {} для группировки. Скрипт на тикле - это линейный список команд, которым можно передавать другие команды в виде строк. То есть никакого синтаксиса особо, почти как в лиспе. Но выглядит почти как C-like.

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

То что ТС хочет записывалось бы так:

case when {cond} then {
   .... 
} else {
   ....
}
anonymous
()
Ответ на: комментарий от Jills
CASE WHEN <условие> THEN 
p 'true' 
ELSE 
p'false' 
END

sql-ое условие

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

Если ты про (object & object) и (object | object) то да, через __and__ и __or__ методы класса. Но они, по-моему, равноприоритетные и поэтому, блин, приходится скобочки ставить.

true_admin ★★★★★
()

Но зачем, если можно написать

case
when true
  p 'true'
else
  p 'false'
end

Можете привести более полезный пример или объяснить нужность примера из ОП-поста? А то я не могу понять конечную цель.

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

Это больше похоже на contrived example, а вообще цель - нормальный eDSL, что руби в общем умеет, но с большими ограничениями. Хотя в мейнстриме лучше нет, и это делает руби годным и нужным. А так тикль и лисп конечно бьют рубин на этом поле по всем статьям, но маргинальщина, увы.

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

Это больше похоже на contrived example

Еще возможно, что ТС хочет embedded SQL средствами руби. То есть опять же нужен DSL, но красиво не получится.

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

Есть оператор условия, написанное на известно заранее языке. (будет то Basic или что-либо другое, не важно), нужно чтобы это условие обрабатывалось интерпритатором Ruby.

Парсинг не подходит.

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

Про это я знаю.

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

По гвидо-ван-россумовски (ГВР, разд. 10.2.3. стр 108;-)) они разноприоритетные. По мере убывания приоритета это выглядит так:

x ** y
Оператор возведения в степень имеет больший приоритет, чем унарный арифме-
тический или битовый оператор слева, но меньший, чем унарный арифметический
или битовый оператор справа (во избежание нелепых ошибок использование опе-
ратора not справа от любого арифметического или битового оператора не допус-
кается). Так, например, выражение ‘-x ** -y’ будет вычисляться справа налево,
то есть эквивалентно выражению ‘-(x ** (-y))’.
+x, -x, ~x
x * y, x / y, x%y
x + y, x - y
x << y, x >> y
x & y
x ^ y
x | y
Но скобочки ставить все равно полезно, кто ж такие мелочи помнит.

Я то вообще про

if a>0 or b<0 and c==a+b : ...
во втором их перегружать нельзя;-(

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

Есть оператор условия, написанное на известно заранее языке. (будет то Basic или что-либо другое, не важно), нужно чтобы это условие обрабатывалось интерпритатором Ruby.

Для этого вам нужно будет реализовать подмножество «заранее известного языка» на Ruby. Как сделано в Rouge, например.

Однако, позволю себе предположить, что на самом деле вам хочется не совсем того, что вы написали. По крайней мере, я не вижу в этом никакой практической надобности. Более здравым выглядит — при возникновении необходимости выполнять код, написанный на «заранее известном языке», выполнять его на «заранее известном языке». А в Ruby — только получать результат выполнения.

Зачем велосипедить неидиоматичные конструкции? Если нужен SQL, то почему бы не воспользоваться одним из адаптеров?

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

во втором их перегружать нельзя;-(

Тогда я не понимаю что ты имеешь в виду «перегружать». Это бинарные операторы, у них аргументами могут быть любые выражения. Покажи пример на псевдокоде.

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

По поводу приоритета это я ошибся. Я перегружал __and__ и __or__ для нужд парсера (что-то типа BNF городил силами питона), так вот всё время хотелось чтобы у «|» был приоритет выше чем у «&».

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

Наоборот, это хорошо и правильно.

anonymous
()

ты придумал НЁХ. В C++ так тоже нельзя, ибо за это убивают.

drBatty ★★
()

Зачем этот огород?! По-простому же можно:

if true
  p 'true'
else
  p 'false'
end

И так можно:

if false
  p 'false1'
elsif true
  p 'true'
else
  p 'false2'
end

Что я не понял в вопросе?

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

а в плюсах вроде как можно

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

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

Что я не понял в вопросе?

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

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

с динамической типизайцией?

неее, только не это. Хотя это бы сильно облегчило очень многое. Поэтому и страдаю - задуманные фишки в компиляторе воплотить моими силами нереально.

Но потеря скорости, разжирение рантайма и ошибки типизации этого не стоят, имхо. Я бы голосовал за опциональную динамическую типизацию (всё равно динамика 99% не нужна).

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

Нужно автоматическое выведение типов.

ИМНО самый простой путь - конвертация своего кода во что нить типа С/C++, а дальше пусть gcc корячится. Мы во всяком случае решили так пойти;-)

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

Я бы голосовал за опциональную динамическую типизацию (всё равно динамика 99% не нужна).

Если бы ты занялся опциональной статической типизацией для Python, это было бы гораздо полезнее для человечества.

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

Кодогенератор для числодробилок. Ссылки пока нету, не созрел ище, мы стесняемся;-).

Пишется на питоне и для питона. Т.е. числ. схема задается в питоньем файле как набор питоньих ф-й, пережевывается и превращается в код на С++. То, что жует конкретный класс схем, называется каркасом, можно его рассматривать как шаблон для кода (не в смысле плюсов а в смысле ворда;-)). Раньше каркас был набором .[hc]pp файлов, куда в слоты втыкались фрагменты кода. Щас мы от этого отказались, все описывается на питоне (т.е. для каждой плюсовой сущности создается питоний аналог). В каком то смысле выходит что питон работает как макроязык. Ну и там много декораторов и игр с контекстом выполнения. И да, я хочу автоматический вывод типов, но это чуть позже.

Если интересно то давай в почту (только я твою не знаю, а ты мою должен видеть;-)), что бы тут не разводить оффтопик.

ЗЫ а что такое линтер О_О? Вики говорит что это наша супер-пупер СУБД.

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

что такое линтер?

это программа для статистической проверки кода. Название пошло от http://en.wikipedia.org/wiki/Lint_(software).

ты мою должен видеть

я уже не модератор :). Можешь написать мне на spam собака messir.net?

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

Я даже потихоньку пилю свой ЯП, но без шансов допилить его до полноценного состояния.

Только вчера новость про Rust пробегала. Не то? По-моему очень годно.

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

По-моему очень годно.

Я тоже пришёл к мнению что оно годно. Вот в go, например, убрали тернарный оператор. Кстати, в rust тоже пытались это сделать. Мне дико это слышать.

Тем не менее, руки чешутся что-нить своё замутить.

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

Который дает гарантии, сравнимые со статической типизацией.

Вроде еще никому такой не удалось сделать ни для одного динамического языка. Я не прав?

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

Который дает гарантии, сравнимые со статической типизацией.

Честно сказать, я не уверен в будущем питона. Мне он становится не интересен из-за того что он практически остановился в развитии. Поэтому не очень хочется заниматься линтером.

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

это программа для статистической проверки кода

Ужос. Я бы не взялся такое писать;-( Декоратор для проверки типа еще куда ни шло...

я уже не модератор :).

Выгнали за аморалку?;-) написал.

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

Если в языке все конструкции возвращают значения, то не очень и нужно.

Речь не о том что теперь что-то стало нельзя сделать. Просто некрасиво без него, имхо. Тут я бы хотел сказать «некрасивый ЯП не взлетит», но это не так.

Вот обсуждение вопроса: https://github.com/mozilla/rust/issues/1698

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

Вроде еще никому такой не удалось сделать ни для одного динамического языка

Для полного языка - нет, для подмножества - да. RPython, ShedSkin, что-то для Ruby.

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

Я бы не взялся такое писать

пока речь только о прикручивании статической типизации к питону :).

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

я не уверен в будущем питона. Мне он становится не интересен из-за того что он практически остановился в развитии

/me пожал плечами в недоумении и не нашелся, что ответить

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

для подмножества - да. RPython, ShedSkin

эээ, так ведь rpython это оочень скромно. Это как раз уровень того что можно сделать моими силами. Я бы даже замахнулся на бОльшее. Но rpython и python это небо и земля.

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