Не баг с выводом константы


#1
PascalABCCompiler.Core v3.5.0.2217 (27.07.2019), debug version
Runtime version: 4.0.30319.42000
OS version: Microsoft Windows NT 6.1.7601 Service Pack 1
Processor count: 2
WorkingSet: 92368 kb

program test;

uses System;

const
    q: array [0..1] of byte = (0, 1);

var
    w := new byte[2](0, 1);

begin
    Console.WriteLine($'{q}');
    Console.WriteLine(q);
    Console.WriteLine($'{w}');
    Console.WriteLine(w);
    Console.ReadKey(true);
end.

#2

Это не баг - это и в C# так. Пользуйтесь Write или Print


#3

Очередной повод вспомнить про KISS (Keep It Simple, Stupid!) и пользоваться штатными средствами PacalABC.NЕТ )))


#4

Спасибо за ответ! И еще меня интересует: 1 - стоит ли использовать строки $’’ или надежнее через ().ToString ? 2 - почему программа выводящая через writeln весит на 0.5КБ больше, чем программа выводящая через Console.WriteLine() ?


#5

Вы можете, конечно, подождать ответа, а можете посмотреть сами код этих методов - исходник же открыт. На интерполированные строки (так тут называются эти самые $’ ') пока что вроде бы никто не жаловался. Что до длины программы Writeln - это особенности ее волшебной реализации: тут она умеет выводить буквально всё.


#6

То есть если написать эквивалентную программу на C#, то она тоже выведет “test.$pascal_array1”? А как же сишарперы выводят без writeln и println?


#7

Плохо они живут )


#8
  1. Стоит. Это современнее.
  2. Программа с writeln подтягивает сложную стандартную функцию вывода. Вот как раз на 0.5 К. А C# функция сами видите как выводит

#9

А точнее - в данных случаях вызывается метод .ToString, стандартный для .Net, который лишь выписывает тип объекта вместо его содержимого (для массивов он не переопределён, ибо это лишнее усложнение).

$pascal_array1 это имя внутреннего типа, класса в который разворачиваются статичные массивы. Этот класс работает через динамичный массив, но медленнее и довольно ограничен в функционале, поэтому его использование не желательно. Он оставлен только для совместимости со старыми паскалями.

Форматные строки ($'', да, правильно “интерполированные”, но это слишком сложное слово) вызывают o=nil?'':o.ToString для каждого своего параметра.

Однако вопрос некорректный, .ToString надо применять для получения строки 1 объекта.
Зато в этом случае:

$'a={a}, b={b}'
'a='+a.ToString+'b='+b.ToString

Вторая строчка это ужасный говнокод. Сложение более чем 2 строк плюсами - выполняет кучу лишних действий.

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

Потому что компилятор по возможности удаляет неиспользуемый функционал из .exe .
Console.WriteLine это стандартный метод из стандартной .Net .dll-ки. В то время как Writeln описан в системном модуле паскаля - PABCSystem. Поэтому первый удалить нельзя (его реализация и не записывается в .exe), а второй можно.

Ручками вывод пишут. То есть по 1 элементу выводят у массивов.


#10

@Nikolaj_Tkachenko, теперь можно и не писать. Для NET и PascalABC.NET есть отдельные модули. Когда в C# можно будет перегружать операторы для внешних типов, код которых нельзя менять - тогда можно будет более кратко некоторые операции записывать.

Пример трёх идентичных программ:

Их результат выполнения:

Также возможен вывод содержимого своих типов:

Главные особенности:

  • Поддерживаются исключительно кортежи System.ValueTuple<T, ...> как в изначальной библиотеке, так и в модулях для PascalABC.NET.
  • Возможно чтение кортежей, массивов и матриц с клавиатуры с указанием обработчика ошибки, которая может возникнуть при неверном вводе.
  • Множество интерфейсов для стандартизации кода собственных коллекций.
  • Классы прокси-типы, предназначенные для отладчиков Rider и Visual Studio.

Страница поддержки здесь.


#11

Библиотека хорошая, но я не про то говорил.

В C# это делают программисты, использующие язык. То есть каждый выбирает как реализовывать или чью реализацию брать.
А в PABC.Net уже есть реализация с завода.

И нет, ни 1 из вариантов не является плохим, оба хороши в своих ситуациях.

P.S. Ссыли на скачивание лучша давать отсюда, так сторонние ресурсы вроде гугл диска не нужны.


#12

Хорошая идея.