Size: a a a

Сrystal Lang — русскоговорящее сообщество

2021 October 15

AM

Alexander Maslov in Сrystal Lang — русскоговорящее сообщество
кстати, помню как-то с макросами игрался и делал переменные в макросе + методы для обращения к ним и вроде работало
источник

AM

Alexander Maslov in Сrystal Lang — русскоговорящее сообщество
правда, очень давно было, может где-то соврал или контекст был другой )
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Из макросов легко генерируются куски классов (например, макросы getter, property генерируют как TypeDeclaration'ы, так акцесоры), но почему-то локальные переменные так не создаются.
Тоже был удивлён
источник

АК

Андрей Коновод... in Сrystal Lang — русскоговорящее сообщество
переменные созданные в макросах удаляются при выходе из них. Было сделано специально при фиксе https://github.com/crystal-lang/crystal/issues/1852
источник

АК

Андрей Коновод... in Сrystal Lang — русскоговорящее сообщество
хотя причина не совсем понятна
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Но это не работает и если поместить puts z.class внутрь макроса
источник

АК

Андрей Коновод... in Сrystal Lang — русскоговорящее сообщество
если при этом снаружи вызов убрать то должно работать
источник

АК

Андрей Коновод... in Сrystal Lang — русскоговорящее сообщество
ну и да, для переменных которые ограничены макросом есть frеsh variables (%x), так что смысла в обычных я не вижу
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Так это генерация объявлений типов обычных переменных
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Кстати, заработало
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество

macro dcl(*args)
 {% aa = [] of (Path|Call) %}
 {% for x in args %}
   {% if x.is_a?(TypeDeclaration) %}
     {% aa.push(x.var) %}
     {% t = x.type %}
   {% else %}
     {% aa.push(x) %}
   {% end %}
 {% end %}
 {% for v in aa %}
   {{v.id}} : {{t.id}}
 {% end %}
 {% debug %}
end

dcl x, y, z : Float64
z = 0
puts z.class
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
И z магичеким образом становится Float64 🙂
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Почему в самом языке исходно нельзя делать
x, y, z : Int64 - это вообще тайна, покрытая браком.
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Я и не знал, что типы в Ruby 3 завезли, но на самом деле нет:

Ruby 3 came with a lot of notes emphasizing backward compatibility specifically. The team wanted to make groundbreaking improvements, but not at the cost of forcing developers to shift completely to the new version to use those benefits. The current version of RBS has been built with complete support for old versions of Ruby.  

An important factor in enabling backward compatibility has been the decision to keep type declarations separate from the main code.
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Думал, вот сейчас посмотрю, а как там декларации выглядят.
Ага, конечно, отдельным файлом конфигурации для тайп-чекера они там выглядят...
источник

TF

Terry Filch in Сrystal Lang — русскоговорящее сообщество
источник

DV

Dmitriy Vishnevskiy in Сrystal Lang — русскоговорящее сообщество
В sorbet аннотации над методами писать можно, насколько я помню
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Брр, какая жесть
источник

DV

Dmitriy Vishnevskiy in Сrystal Lang — русскоговорящее сообщество
Для любителей rdoc над каждым методом писать, думаю, зашло))
источник

AP

Alexander Popov in Сrystal Lang — русскоговорящее сообщество
Для совместимости синтаксиса.
источник