Войти
ФлеймФорумПроЭкты

Ü (Programmiersprache) (54 стр)

Страницы: 153 54 55 5659 Следующая »
#795
18:40, 20 окт. 2020

Panzerschrek[CN]
> Строить ли вообще строить код для недостижимых итераций псевдоцикла for?
Это не псевдоцикл, это static_for, и если у тебя его нет как самостоятельной конструкции, я бы его запилил.
static_if и static_for — это, по сути, интерпретируемые конструкции хода компиляции, поэтому я бы так их и исполнял.
Если интерпретатор не дошел до некоторой итерации, то и исполнять (компилировать) ее не надо.
Вообще, тут есть путаница с названиями: почему одни конструкции именованы явно (if/static_if), а другие (for/break/return) — неявно?

#796
19:41, 20 окт. 2020

Adler
> автор языка забыл сделать eval?
eval - скриптопитушня.
Есть ещё constexpr функции, которые можно звать во время компиляции. Какую-то часть функционала eval ими покрыть можно.

}:+()___ [Smile]
> Вообще, тут есть путаница с названиями: почему одни конструкции именованы явно
> (if/static_if), а другие (for/break/return) — неявно?
С for циклом для кортежей сознательно было выбрано решение использовать те же ключевые слова для break/continue, чтобы в каких-нибудь макросах можно было абстрагироваться от типа последовательности (кортеж/массив/контейнер).

#797
20:10, 20 окт. 2020

Panzerschrek[CN]
> eval - не осилил
Ясно.

#798
(Правка: 21:30) 21:29, 20 окт. 2020

Adler
Great V.
Эвал здесь не при чём, он отрабатывает в рантайме, а здесь речь идёт о шаблоногенерации.

#799
21:38, 20 окт. 2020

Delfigamer
Можно запилить шаблоногенерацию через евал. Тогда волшебный "компайл тайм" превращается в обычный рантайм, который генерирует код для следующего рантайма.
И не надо никаких усираний с constexpr, шаблонами, оптимизаторами и прочим говном.

#800
21:41, 20 окт. 2020

Great V.
Конечно, кодогенерация - это замечательно.
Вон, в Го, вроде как, на ней всё и делают.
Только причём здесь эвал?

#801
21:49, 20 окт. 2020

Delfigamer
> Только причём здесь эвал?
Потому что нет смысла встраивать в язык отдельные конструкции для кодогенерации.
Нет смысла делать if + static_if или class + static_class. Это дублирование функционала, порождение нового языка со своими нюансами и порогом вхождения.
Если все делать через eval то у пользователя по умолчанию имеются все необходимые для работы конструкции. Надо сделать if - используешь if, надо сделать класс - используешь класс, надо сделать рекурсию - используешь рекурсию.

#802
23:14, 20 окт. 2020

}:+()___ [Smile]
> static_if и static_for — это, по сути, интерпретируемые конструкции хода
> компиляции, поэтому я бы так их и исполнял

А static_for можно было бы еще натянуть и на перебор полей обычной структуры. Фактически тупли ведь тоже можно считать структурой, где поля названы не буквенными идентификаторами, а числовыми. Только Panzerschrek[CN] зачем-то натянул на них операцию статического индексирования. Скорее всего именно ради этих циклов и натянул, только вот все равно загвоздка с разными типами осталась, и надо подкостыливать такой цикл через static_if.

#803
23:42, 20 окт. 2020

https://rextester.com/SWDD67879

#804
3:52, 21 окт. 2020

Кстати, вопрос - а зачем вообще нужен статик_фор? Для сериализации?
Я вот что-то не припомню сходу, где, например, в С++ появлялась острая нужда проитерироваться по элементам typename... Ts - в основном они передаются сразу всей пачкой, а где не всей пачкой - там вполне срабатывает и паттерн-матчинг на typename F, typename... Rs с рекурсией.

#805
5:14, 21 окт. 2020

Delfigamer
> Я вот что-то не припомню сходу, где, например, в С++ появлялась острая нужда проитерироваться по элементам
Ну так в C++ до сих пор не завезли статической рефлексии. А с ней можно будет делать автоматические сериализаторы, автоматические операторы (по аналогии с = и свежим <=>), кастомные сборщики мусора, да даже просто автоматический debug dump содержимого объектов. Но и без рефлексии такая кодогенерация много где может быть полезна, например, чтобы зафорсить разворот цикла. Или просто чтобы свернуть код вида

func<0>(arg);
func<1>(arg);
func<2>(arg);
func<3>(arg);
#806
10:24, 21 окт. 2020

Delfigamer
> Кстати, вопрос - а зачем вообще нужен статик_фор?

template</ type Y /> // Param - nonempty tuple with unique types.
class variant
{
  template</ type T />
  fn enable_if( type_is_one_of_tuple_elements</ T, Y />() )
  conversion_constructor(T mut val)
    ( index_(0), storage_= zero_init )
  {
    auto mut cur_index= 0s;
    for( & element : typeinfo</Y/>.elements_list )
    {
      static_if( is_same_type</ typeof(element.type)::src_type, T />() )
      {
        unsafe
        {
          move_unsafe( cast_ref_unsafe</T/>(storage_), move(val) );
        }

        index_= u8(cur_index);
        return;
      }
      else
      {
        ++cur_index;
      }
    }
    halt;
  }
#807
20:46, 21 окт. 2020

Короче, сделал игнорирование недостижимых итераций псевдоцикла for для кортежей. Вроде оно работает и нету проблем с определением состояния потока управления для недостижимых операций.

#808
20:42, 22 окт. 2020

Мне уже удалось собрать Компилятором1 все тесты стандартной библиотеки.
Пытаюсь собрать Компилятор2 Компилятором1. Собирается почти что всё, Компилятор1 падает только на одном файле. Чувствую, что сборка Компилятора2 скоро будет.

#809
22:38, 22 окт. 2020

Таки починил последнюю мешавшую сборке Компилятора2 ошибку. Теперь Компилятор2 собирается, тесты проходят. Собрал также Компилятор3 и тесты к нему.
Но пока работает только debug сборка. release сборка падает где-то в оптимизаторе llvm, видать, Компилятор1 где-то генерирует не совсем корректный llvm код.

Страницы: 153 54 55 5659 Следующая »
ФлеймФорумПроЭкты