Как это относится к данной теме? Решили объем сообщения водой увеличить?
Во-вторых, Ваш код был назван так, как на скриншоте, поскольку, опять же видна внутренняя реализация, но Вам, кажется, на этот момент всё-равно и Вы готовы поливать других грязью, когда нет аргументов. Не так ли?
В третьих, перестаньте тыкать. Мы с Вами не друзья, просто знакомые.
Рассчитаны - почему нет. Но класс и пространство имён генерируются автоматически.
И в отдельном классе - подпрограммы поддержки Паскаля (множества, файлы).
Можно заняться конечно тем, чтобы для разработчиков C# библиотеки было приятнее использовать. Я вот не знаю, есть ли такой атрибут, чтобы не показывать что-то в интеллисенс Visual Studio.
От скрытия этого от анализатора кода модули сами не инициализируются, зато использовать их будет уже нельзя. Суть именно в том, чтобы InitModule’и сами вызывались если модуль-класс используется. А для этого нужно запихнуть InitModule в статический конструктор модуля-класса. Тогда и писать эти “детали реализации” для каждого модуля не придётся.
Ну а как вы хотели. Графическая библиотека должна инициализироваться. Можно для C# сделать спецфункцию инициализации. Но здесь смешивается специфичность графической библиотеки и она переносится на все библиотеки - говорится, что ни одну не удобно использовать.
Всё правильно. Особо не планировали. Но подключать можно как и везде в .NET. Нейтральные библиотеки подключать неудобно из-за совпадения имени пространства имен и библиотеки - это да.
И если вы в паскаль-библиотеке используете функции вывода паскаля, то придётся вызывать код инициализации.
Но это и всё. Собственно, именно это можно немного переделать - и dll можно будет спокойно использовать. Никто не печётся о лишних 20 Кб, добавляемых в dll.
Нигде, его можно только ручками вызвать. Если засунуть в статический конструктор - графические модули не будут инициализироватся сами. Статический конструктор вызывается только при первом использовании класса.
Нигде. Просто встроенный метод инициализации вызывается в паскале. В C# если писать без инициализации то сразу NullReferenceException выходит. Нужно чтобы инициализация была и в статическом конструкторе
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PABCSystem;
using System.Windows.Media;
using static PABCSystem.PABCSystem;
using static GraphWPF.GraphWPF;
namespace WpfApp1
{
class Program
{
public static void Main(string[] args)
{
//GraphWPF.GraphWPF.__InitModule__();
Rectangle(100, 100, 600, 150, Color.FromRgb(200, 200, 200));
}
}
}
Это не будет работать, пока не раскомментировать строчку с инициализацией, хотя класс GraphWPF, как видите, используется.
/// Вывод двумерного массива, w - ширина поля вывода
function Print<T>(Self: array [,] of T; w: integer := 4): array [,] of T; extensionmethod;
begin
for var i := 0 to Self.RowCount - 1 do
begin
for var j := 0 to Self.ColCount - 1 do
begin
if PrintMatrixWithFormat then
Write(StructuredObjectToString(Self[i, j]).PadLeft(w))
else Print(Self[i, j]);
end;
Writeln;
end;
Result := Self;
end;
но нет для array of T?
Из-за этого в коде:
begin
var arr := ArrRandom(10).Println;
var matr := MatrRandom(10).Println;
end.
arr будет иметь тип sequence of integer. Хотя, можно написать так:
type
&array<T> = array of T;
begin
var arr := &array&<integer>(ArrRandom(10).Println);
var matr := MatrRandom(10).Println;
end.
Для последовательностей это Println - он определён над последовательностями. Нечего последовательность неявно переводить назад в массив - теряется ленивость.
function Println<T>(self: T): T; extensionmethod;
where T: System.Collections.IEnumerable;
begin
foreach var el in self do Print(el);
Result := self;
end;
begin
var coll: ICollection<byte>;
var coll2 := coll.Println; // компилятор понимает что у coll2 тип не IEnumerable<byte>, а именно ICollection<byte>, потому что шаблоны
end.
Это сразу работает для всех последовательностей, а при вызове для типов наследующих от последовательности - возвращает исходный тип, а не IEnumerable. И для массивов это тоже будет работать, то есть можно сразу несколько старых Println, Print и PrintLines-ов заменить подобными.
Какая ленивость? В реализации вашего Println она отсутствует.