Size: a a a

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

2021 September 29

ВВ

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

AB

Alexander B🔮 in Сrystal Lang — русскоговорящее сообщество
Ну да, но там контрибьюторы - будут и обновлять и ноые мож придумывать фишки
источник
2021 September 30

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Как вызвать некие функции по имени, передав эти имена в другую функцию?
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
В Go такую штуку нашёл сразу, в Crystal неожиданно узнал, что почему-то ещё и сами именованные функции - не объект или во всяком случае ХЗ, как к свойствам этого объекта получить доступ.
источник

DV

Dmitriy Vishnevskiy in Сrystal Lang — русскоговорящее сообщество
Я как-то решал через hook method_added, https://crystal-lang.org/reference/syntax_and_semantics/macros/hooks.html
Ща гляну конкретнее как это было
источник

DV

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

DV

Dmitriy Vishnevskiy in Сrystal Lang — русскоговорящее сообщество
И добавил метод send
источник

DV

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

DV

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

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Ух блин... круто
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Непонятно немного, но интересно.
Вообще странно, что функция - не объект. Мне кажется, беда именно в том, что она начинает вызываться раньше, чем компилятор понимает, что её просто как объект юзают
источник

DV

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

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Ну то есть когда всё, включая классы - это объекты, а тут что-то вдруг нет
источник

DV

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

DV

Dmitriy Vishnevskiy in Сrystal Lang — русскоговорящее сообщество
Ща простой пример накатаю
источник

DV

Dmitriy Vishnevskiy in Сrystal Lang — русскоговорящее сообщество
module Sendable
 @@procs = {} of String => Proc(Sendable, Nil)

 def send(method)
   @@procs[method].call(self)
 end

 macro included()
   macro method_added(m)
     @@procs["\{{ m.name }}"] = -> (obj : Sendable) {
       return obj.as({{@type}}).\{{m.name}}
     }
   end
 end

end

class A
 include Sendable

 def a
   puts "Hi"
 end
end

A.new.send("a")
источник

DV

Dmitriy Vishnevskiy in Сrystal Lang — русскоговорящее сообщество
Вот очень кастрированный send без параметров, возвращающий nil
источник

DV

Dmitriy Vishnevskiy in Сrystal Lang — русскоговорящее сообщество
Вложенные макросы - так надо
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Мне бы что-то такое, чтобы можно было в iter_procs передать proc1 и proc2

В Perl для этого есть синтаксис \&fn_name
В Go можно прямо так и передавать, именами функций
C Crystal всё не очень понятно. Похоже, это проблема синтаксического анализа: анализатору не понятно, что я хочу юзать fn_name именно как "объект", а не сделать fn_name()


def proc1
 puts "proc1"
end

def proc2
 puts "proc2"
end

def iter_procs(*fns)
 pp fns
end
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
А что делает obj.as??
источник