4 сообщения перенесены в тему Болталка PascalABC.NET
function f1:byte;
begin
var p:procedure;
p := procedure->writeln(Result);
end;
begin end.
В данной версии компилятора не поддерживается замыкание данного типа символов
Тут ошибка в не правильном сообщении об ошибке или в том что эта фича не реализована? Стоит ли вообще разрешать использовать Result
более высокого уровня если последняя лямбда - процедура?
Если в программе есть форматная строка без параметров - анализатор кода и точки сворачивания сломаны во всей программе.
begin
Writeln($'test');
end.
Это ошибка? И если да, то в том что форматную строку без параметров не даёт делать, или в том что анализатор кода ломается?
В справке не сказано о количестве аргументов в кортежном присвоении… Т.к. „большие“ кортежи очень редки, то данная тонкость забывается!
begin
var(a,b,c,d,e,f,g,h):=(1,2,3,4,5,6,7,8);
end.
Такой код выдаст ошибку ;–(
Пишите какую ошибку выдаёт после кода, пожалуйста.
Возможно кортежи и не должны быть больше 7 элементов, но Undefined FileName
это всегда ошибка которую надо исправить.
Исправили все ошибки с неверными сообщениями в туплах
В Справке по методу cast
приведен такой пример:
begin
var a: sequence of integer;
var b: sequence of real;
a:=Seq(1,3,5);
b:=a.Cast&<real>;
end.
Естественно ожидать, что как и описано, мы получим последовательность элементов типа real. Но она какая-то “неправильная”. Во-первых, её не понимает ни Writeln(b)
, ни b.Println
. Во вторых, к ней нельзя применить ни одно расширение типа .Min, First, Sum и т.п. Да и тип у этого b, если отладчиком стать на end и посмотреть в “локальных переменных” - System.Linq.Enumerable+d__95`1[System.Double] - ну очень мало похож на описанный парой строк выше.
Не спешу открывать issue, может, просто что-то я не так понял?
В описании .NET нашёл, что tuple могут иметь произвольное количество элементов, но если их больше семи, то они представляются как цепочка, связанная через TRest.
У нас нет. Для этого пользуйтесь типом Tuple<>. И сами стройте такие цепочки
Надо убрать этот Cast из справки. Пример неправильный.
Issue явно не для целей замечаний по справке. А то видите - у нас наметились тенденции пихать в Issue всё что приходит на ум. Вместо того чтобы завести топик на форуме и обсуждать там всё что интересно.
Но то что оно с writeln
не работает, выдавая, при том, неадекватную ошибку всё же надо в issue.
Ну там же запрос ленивый - он неправильный и он срабатывает при writeln
А, вот как, когда value-тип обёрнут в объект у него не работает operator explicit
? В таком случае Select
использовать или что? Но ведь в Cast
посылается только тип, и на этапе компиляции, а в Select
целая функция, которая потом ещё по указателю вызывается… Это точно невозможно реализовать, к примеру проверкой при компиляции, если T
это value
-то вызывать по другому преобразование?
Я ничего не понял, что Вы написали в последнем топике. Если можно - примеры
begin
var i:integer := 5;
var o:object := i;
var r:real := real(o);
end.
После преобразования integer
к object
- его уже нельзя преобразовать к real
. То есть ищет типы к которым можно преобразовать среди наследников, но игнорирует integer.operator implicit
, которым integer
можно преобразовать к real
.
А, понял. Нет, operator explicit я думаю не работает. Вообще, это какое-то тёмное дело преобразовывать упакованные размерные типы с помощью переопределённого оператора. Я бы не стал это делать ни на каком языке.
Код, который Вы привели, - ошибочный. Это не приведение типов - это распаковка, причем, в неверный тип. И, я думаю, распаковку переопределить нельзя. Это такая базовая для NET операция. Ну собственно Вы это и видите.
А можно правильный пример? Я вообще не пойму, как его использовать.
Надо использовать на наследниках:
type
t1=class end;
t2=class(t1) end;
begin
var a1 := new t1[1](new t1);
var a2 := a1.Cast&<t2>;
var a3 := a2.Cast&<t1>;
end.
Не могу, в последней версии уже нет доступа к TRest. Например, (1,2,3,4,5,6,7,(8,9)) теперь вызывает ошибку. Раньше тоже некая путаница была, так как такая запись была “хаком” для ввода (1,2,3,4,5,6,7,8,9) И вроде, запятую нельзя перегрузить, чтобы переложить на компьютер заботу о таких тонкостях.
type
e1=(
es1 = 1,
es2 = 2
);
begin end.
Форматируется в:
type
e1 = (es1= 1,
es2= 2
);
begin end.
То есть es1
никак не даёт описать на следующей строчке. А ещё оно убрало пробелы между es1
и =
, и так же с es2
.
Что из этого годится для issue
и сколько отдельных делать?