Форум программистов, компьютерный форум, киберфорум
.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/26: Рейтинг темы: голосов - 26, средняя оценка - 5.00
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
1

Библиотека NETSquirrel для .NET и .NET Core

01.11.2019, 12:49. Просмотров 5069. Ответов 14


Краткое описание
NETSquirrel - идейное продолжение и обобщение системного модуля PABCSystem на платформы NET и NETCore. Её цель: сделать переход на другие .NET языки с PascalABC.NET и обратно наиболее безболезненным.

Подробное описание
Главная идея, заложенная в библиотеку - расширить привычный функционал модуля PABCSystem (точнее, его часть, поскольку PABCSystem также занимается системными задачами) до уровня всей платформы .NET (.NET Framework/.NET Core). NETSquirrel - продолжение начатого разработчиками PascalABC.NET модуля со своими добавлениями. Это позволит обеспечить наиболее безболезненный переход с PascalABC.NET на C# или другие .NET языки или в обратном направлении. Новое, что внесла библиотека - это:
1. Множество интерфейсов, для написания коллекций и их immutable версий.
2. Новые утилитные методы, например, для чтения кортежей, массивов и матриц с возможностью одновременной обработки ошибок при неверном вводе.
3. Методы расширения для вывода и изменения кортежей, массивов, матриц и последовательностей.
Библиотека широко использует паттерн null object, при реализации которого при неверных входных данных не бросается исключение, а возвращается объект-пустышка указанного типа.
4. Прокси-типы, которые позволяют указать как программист хочет чтобы пользователь видел некоторую коллекцию в отладчике Visual Studio или Rider.


Полезные ссылки
Официальный сайт (en)
Организация проекта (en/ru)
Документация (en)
Примеры кода
Группа поддержки (en/ru)

Ссылки на темы из соседних разделов
Тема в разделе PascalABC (ru)
Тема в разделе PascalABC.NET (ru)

Примеры кода
Генерация последовательностей:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using NETSquirrel.Extensions;
 
namespace Test
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            1.To(10).PrintLine(); // 1, 2, ..., 10
            10.DownTo(1).PrintLine(); // 10, 9, ..., 1
            10.ToThis().PrintLine(); // 0, 1, ..., 10
        }
    }
}
Генерация массива, содержащего числа Фибоначчи:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using NETSquirrel.Extensions;
using NETSquirrel.Utils;
 
namespace Test
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            ArraysUtils.GenerateArray<int>(10, (array, i) => {
                switch (i)
                {
                    case 0:
                    case 1:
                        return 1;
                    default:
                        return array[i - 1] + array[i - 2];
                }
            }).PrintLine(); // 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
        }
    }
}


Внимание: библиотека предоставляет высокоуровневый функционал, за что пользователю приходится в какой-то степени платить за это производительностью. Не используйте LINQ и подобный функционал библиотеки при нужде максимального быстродействия. Не злоупотребляйте большим количеством предоставляемых возможностей, нанося при этом вред производительности.

Главное в проекте NETSquirrel
- Замечания и предложения - источник жизни библиотеки и её экосистемы, поскольку они позволяют отпалировывать неточности и улучшать проект.
- Аргументы и факты - именно на этом строятся обсуждения функционала NETSquirrel, эмоции - имеют место быть, но не могут служить поводом для добавления (изменения) новой (существующей) функциональности, если не подкрепляются чем-либо.
- Уважение к пользователям - главный принцип общения с ними. Разработчики не должны посылать пользователя (даже вежливо) с каким-либо вопросом, если им лень с ним разбираться.
- Мы не разбрасываемся пользователями - для нас все важны, какими бы придирчивыми они не были.
- Открытость и доступность информации - главная причина уделения немалого количества времени к организационным вопросам (репозиторию и уведомлениям пользователей об изменениях).


0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2019, 12:49
Ответы с готовыми решениями:

Разница между .Net Framework и .Net Core
Собственно, основной вопрос в названии темы. Из прочитанных статей понял, что core призван...

Библиотека для управления запросами с поддержкой Socks4, Socks5 для .NET
Столкнулся с необходимостью отправлять запросы на сервер через прокси разного типа - http, socks4,...

.NET Core
Привет форумчане! Интересно узнать мнение общества по поводу .Net Core. В августе 2018 года была...

Сложности с .NET Core
Привет всем. Начал осваивать .net core, думал на обычный дотнет больше будет похоже... Вопросы...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
14
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
02.11.2019, 21:30  [ТС] 2
Доступен NETSquirrel 0.0.25 [Night build].

Минимальные требования:
- NETCore: 2.2
- NET: 4.5

Зависимости:
- NuGet пакет System.ValueTuple 4.5.0

Улучшения:
- Улучшения методов вывода
- Математические расширения для IEnumerable<>
- Исправление ReadStringMatrix

Пример:
C#

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using NETSquirrel.Extensions;
using NETSquirrel.Utils;
 
namespace Test
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            ArraysUtils.CreateRandomIntArray(10, -10, 11).PrintLine().Abs().PrintLine();
        }
    }
}

Visual Basic.NET
vb.net
1
2
3
4
5
6
7
8
Imports NETSquirrel.Extensions
Imports NETSquirrel.Utils
 
Module Module1
    Sub Main()
        ArraysUtils.CreateRandomIntArray(10, -10, 11).PrintLine().Abs().PrintLine()
    End Sub
End Module

Managed C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "pch.h"
using namespace NETSquirrel::Utils;
using namespace NETSquirrel::Extensions;
 
using namespace System;
 
template<typename T>
using Ptr = System::Collections::Generic::IEnumerable<T>^;
 
using Ut = ArraysUtils;
using Ex = IEnumerableExtensions;
 
int main(array<System::String ^> ^args)
{
    auto x = Ut::CreateRandomIntArray(10, -10, 11);
    Ex::PrintLine((Ptr<int>)x, ", ");
    Ex::PrintLine(Ex::Abs(x), ", ");
    return 0;
}

PascalABC.NET
Pascal
1
2
3
4
5
6
7
{$reference NETSquirrel.dll}
uses NETSquirrel;
uses NETSquirrel.Utils;
 
begin
  ArraysUtils.CreateRandomIntArray(10, -10, 11).PrintLine().Abs().PrintLine();
end.

Вывод:
9 1 -5 -4 -7 10 -10 1 -9 4
9 1 5 4 7 10 10 1 9 4
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
03.11.2019, 22:16  [ТС] 3
Решение задачи через NETSquirrel 0.0.25:
Найти символ в строке, встречающийся наибольшее и наименьшее число раз.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Решение через NETSquirrel для поиска символов с наибольшим количеством повторений:
using NETSquirrel.Extensions;
using System.Linq;
 
namespace NETSquirrelApplicationTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var s = "aabbbcccll".PrintLine();
            var maxRepeation = s.GroupBy(z => z).Max(gr => gr.Count());
            var result = s.Where(ch => s.Count(y => y == ch) == maxRepeation);
 
            $"The following chars repeats {maxRepeation} times:".PrintLine();
            result.Distinct().PrintLine();
        }
    }
}


Решение задачи через NETSquirrel 0.0.25:
Отсортировать массив по убыванию и вывести на экран.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using NETSquirrel.Extensions;
using NETSquirrel.Utils;
 
namespace NETSquirrelApplicationTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            ArraysUtils.CreateRandomIntArray(10, 0, 100).PrintLine()
                .OrderByDescending().PrintLine();
        }
    }
}


Решение задачи через NETSquirrel 0.0.25:
Ввести М. Найти сумму 1/4+1/9+...+1/M2.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using NETSquirrel.Extensions;
using NETSquirrel.Utils;
using System.Linq;
 
namespace NETSquirrelApplicationTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            2.To(BaseTypesUtils.ReadInt("M = ")).Select(x => 1f / (x * x)).PrintLine().Sum().PrintLine();
        }
    }
}
Проблемы:
- При вводе строки, вместо числа произойдёт падение программы. Решение: добавить try-catch.




Решение задачи через NETSquirrel 0.0.25:
Заполнить одномерный массив числовыми данными случайным образом (из промежутка [-10; 10]). Определить сумму положительных и количество отрицательных элементов массива.
И после этого модифицировать программу, изменив диапазон случайных чисел
Диапазон [0;-100]
Задание: Обменять местами наибольший и наименьший элементы.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Выполняется лишь обмен местами максимального и минимального элементов массива.
// Остальная часть решения опущена.
using NETSquirrel.Extensions;
using NETSquirrel.Utils;
 
namespace NETSquirrelApplicationTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var x = ArraysUtils.CreateRandomIntArray(10, -10, 11);
            x.PrintLine();
            BaseTypesUtils.Swap(ref x[x.MinIndex()], ref x[x.MaxIndex()]);
            x.PrintLine();
        }
    }
}
Поиск индексов для минимального и максимального элементов можно объединить в один цикл ради оптимизации.



Решение задачи через NETSquirrel 0.0.25:
Как сделать, чтобы пользователь сам ввел свой размер матрицы?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using NETSquirrel.Extensions;
using NETSquirrel.Utils;
using System;
 
namespace NETSquirrelApplicationTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var random = new Random();
            MatricesUtils.GenerateMatrix<int>(BaseTypesUtils.ReadInt("Rows:"), BaseTypesUtils.ReadInt("Columns:"),
                (matrix, i, j) => ((i - 1) * matrix.GetLength(1)) - 1 + j).PrintAsMatrix()
                .PrintEmptyLine()
                .SelectedAsMatrix((x, i, j) => i == j ? random.Next(41) : x).PrintAsMatrix();
        }
    }
}
Проблемы:
- При вводе строки, вместо числа произойдёт падение программы. Решение: добавить try-catch.
1
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
06.11.2019, 15:41  [ТС] 4
Сравнение эффективности вывода матриц в NETSquirrel 0.0.25 [Night build] и PABCSystem:
Тестирование на C#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using PABCSystemUnit = PABCSystem.PABCSystem;
using PABCSystem_implementation______;
using NETSquirrel.Utils;
using System.Diagnostics;
using NETSquirrel.Extensions;
using System.Text;
 
internal class Program
{
    public static long NETSquirrelMatricesOutput()
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
 
        for (int i = 1; i < MaxRowsCount; i++)
            for (int j = 1; j < MaxColumnsCount; j++)
            {
                MatricesUtils.CreateRandomIntMatrix(i, j, Min, Max).PrintAsMatrix();
                "".PrintLine();
            }
 
        stopWatch.Stop();
        return stopWatch.ElapsedMilliseconds;
    }
 
    public static long PABCSystemMatricesOutput()
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
 
        for (int i = 1; i < MaxRowsCount; i++)
            for (int j = 1; j < MaxColumnsCount; j++)
            {
                PABCSystemUnit.MatrRandom(i, j, Min, Max).Print();
                PABCSystemUnit.Println();
            }
 
        stopWatch.Stop();
        return stopWatch.ElapsedMilliseconds;
    }
 
    public static void ExecuteTest(ref long netSquirrelTime, ref long pabcSystemTime)
    {
        netSquirrelTime += NETSquirrelMatricesOutput();
        new StringBuilder().Append('=', 10).PrintLine();
        pabcSystemTime += PABCSystemMatricesOutput();
        new StringBuilder().Append('*', 10).PrintLine();
    }
 
    private static void Main(string[] args)
    {
        PABCSystemUnit.__InitModule__();
        long netSquirrelAverage = 0;
        long pabcSystemAverage = 0;
        for (int i = 0; i < TestsCount; i++)
            ExecuteTest(ref netSquirrelAverage, ref pabcSystemAverage);
 
        $"NETSquirrel = {netSquirrelAverage / TestsCount}, PABCSystem = {pabcSystemAverage / TestsCount}".PrintLine();
    }
 
    private const int MaxRowsCount = 10;
    private const int MaxColumnsCount = 10;
    private const int Min = -10000;
    private const int Max = 10000;
    private const int TestsCount = 10;
}

Тестирование на PascalABC.NET
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
{$reference NETSquirrel.dll}
uses NETSquirrel.Utils;
uses System.Diagnostics;
uses NETSquirrel.Extensions;
uses System.Text;
 
const
  MaxRowsCount = 10;
  MaxColumnsCount = 10;
  Min = -10000;
  Max = 10000;
  TestsCount = 10;
 
function NETSquirrelMatricesOutput(): integer;
begin
  var _stopWatch := new Stopwatch();
  _stopWatch.Start();
 
  for var i := 1 to MaxRowsCount do
    for var j := 1 to MaxColumnsCount do
    begin
      MatricesUtils.CreateRandomIntMatrix(i, j, Min, Max).PrintAsMatrix();
      ''.PrintLine();
    end;
  
  _stopWatch.Stop();
  Result := _stopWatch.ElapsedMilliseconds;
end;
 
function PABCSystemMatricesOutput(): integer;
begin
  var _stopWatch := new Stopwatch();
  _stopWatch.Start();
 
  for var i := 1 to MaxRowsCount do
    for var j := 1 to MaxColumnsCount do
    begin
      MatrRandom(i, j, Min, Max).Print();
      Println();
    end;
  
  _stopWatch.Stop();
  Result := _stopWatch.ElapsedMilliseconds;
end;
 
procedure ExecuteTest(var netSquirrelTime, pabcSystemTime: int64);
begin
  netSquirrelTime += NETSquirrelMatricesOutput();
  (new StringBuilder()).Append('=', 10).PrintLine();
  pabcSystemTime += PABCSystemMatricesOutput();
  (new StringBuilder()).Append('*', 10).PrintLine();
end;
 
begin
  var netSquirrelAverage: int64 = 0;
  var pabcSystemAverage: int64 = 0;
  for var i := 0 to TestsCount - 1 do
    ExecuteTest(netSquirrelAverage, pabcSystemAverage);
 
  $'NETSquirrel = {netSquirrelAverage / TestsCount}, PABCSystem = {pabcSystemAverage / TestsCount}'.PrintLine();
end.


Реализация вывода матриц в NETSquirrel

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        /// <summary> 
        /// Outputs the current matrix with the specified delimiter. 
        /// </summary> 
        /// <param name="matrix">The matrix.</param> 
        /// <param name="delimiter">The delimiter.</param> 
        /// <typeparam name="T">The value type.</typeparam> 
        /// <returns>The matrix.</returns> 
        public static T[,] PrintAsMatrix<T>(this T[,] matrix, string delimiter = DelimitersHelper.DefaultDelimiter) 
        { 
            if (matrix is null) 
                ThrowArgumentNullException_Matrix(nameof(matrix));
 
            return matrix.InternalPrintAsMatrix(delimiter); 
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        private static T[,] InternalPrintAsMatrix<T>(this T[,] matrix, string delimiter) 
        { 
            int rowsCount = matrix.GetLength(0); 
            int columnsCount = matrix.GetLength(1); 
            int[] lengths = new int[columnsCount]; 
 
            for (int j = 0; j < columnsCount; j++) 
                for (int i = 0; i < rowsCount; i++) 
                { 
                    int itemLength = matrix[i, j].ToString().Length; 
                    if (itemLength > lengths[j]) 
                        lengths[j] = itemLength; 
                }
 
            int lastColumnIndex = columnsCount - 1;
            for (int i = 0; i < rowsCount; i++) 
            {
                for (int j = 0; j < columnsCount; j++)
                    Write($"{matrix[i, j].ToString().PadLeft(lengths[j])}{(j < lastColumnIndex ? delimiter : string.Empty)}"); 
                WriteLine(); 
            } 
 
            return matrix; 
        }
Главная идея следующая: узнать в каждом столбце находится объект с наиболее длинным строковым представлением и выполнять выравнивание всех остальных в данном столбце по нему.

Реализация вывода матриц в PABCSystem

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// Вывод двумерного массива, 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;
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
function StructuredObjectToString(o: Object; n: integer := 0): string;
const
  nmax = 100;
  nmax1 = 30;
begin
  if o = nil then
    Result := 'nil' 
  else if o is System.Reflection.Pointer then
    Result := PointerToString(System.Reflection.Pointer.Unbox(o))
  else if (o.GetType = typeof(real)) or (o.GetType = typeof(decimal)) or (o.GetType = typeof(single)) then
    Result := FormatFloatNumber(o.ToString)
  else if (o.GetType = typeof(Complex)) then 
  begin
    var c := Complex(o);
    Result := '(' + StructuredObjectToString(c.Real) + ',' + StructuredObjectToString(c.Imaginary) + ')';
  end
  else if (o.GetType.IsPrimitive) or (o.GetType = typeof(string)) then
    Result := o.ToString
  else if o is System.Array then
  begin
    var a := o as System.Array;  
    Result := ArrNToString(a, new integer[a.Rank], 0); 
  end
  else if o is System.Collections.IEnumerable then
  begin
    var sb := new StringBuilder();
    var g := (o as System.Collections.IEnumerable).GetEnumerator();
    
    var isdictorset := o.GetType.Name.Equals('Dictionary`2') or o.GetType.Name.Equals('SortedDictionary`2') or (o.GetType = typeof(TypedSet)) or o.GetType.Name.Equals('HashSet`1') or o.GetType.Name.Equals('SortedSet`1');
    if isdictorset then
      sb.Append('{')
    else sb.Append('[');
    if g.MoveNext() then
    begin  
      sb.Append(StructuredObjectToString(g.Current, n + 1));
      var cnt := 1;  
      while g.MoveNext() and (cnt < nmax) do 
      begin
        sb.Append(',');
        sb.Append(StructuredObjectToString(g.Current, n + 1));
        cnt += 1;
      end;
      if cnt >= nmax then 
        sb.Append(',...');
    end;    
    
    if isdictorset then
      sb.Append('}')
    else sb.Append(']');
    Result := sb.ToString;
  end
  else if o.GetType.GetField('NullBasedArray') <> nil then
  begin
    var f := o.GetType.GetField('NullBasedArray');
    Result := StructuredObjectToString(f.GetValue(o));
  end
  else
  begin
    var q := RedefinedToString(o);
    var gg := o.GetType.FullName.StartsWith('System.Tuple');
    var gg1 := o.GetType.Name.StartsWith('KeyValuePair');
    if (q <> nil) and q.IsVirtual and not gg and not gg1 then
      Result := o.ToString
    else 
    begin
      var t := o.GetType;
      var sb := new System.Text.StringBuilder();
      sb.Append('(');
      if n > nmax1 then
        sb.Append('....')
      else 
        while t <> typeof(object) do
        begin
          var ff := t.GetFields(System.Reflection.BindingFlags.Public or System.Reflection.BindingFlags.Instance or System.Reflection.BindingFlags.DeclaredOnly);
          var pp := t.GetProperties(System.Reflection.BindingFlags.Public or System.Reflection.BindingFlags.Instance or System.Reflection.BindingFlags.DeclaredOnly);
          
          for var i := ff.Length - 1 downto 0 do
            sb.Insert(1, StructuredObjectToString(ff[i].GetValue(o), n + 1) + ',');
          
          for var i := pp.Length - 1 downto 0 do
            if pp[i].GetIndexParameters.Length = 0 then
              sb.Insert(1, StructuredObjectToString(pp[i].GetValue(o, nil), n + 1) + ',');
          
          t := t.BaseType;
        end; 
      if sb.Length > 1 then 
        sb.Length := sb.Length - 1;
      sb.Append(')');
      Result := sb.ToString;
    end;
  end;
end;
Главная идея следующая: выравнивать по строго заданной ширине элементы столбцов.

Результаты: NETSquirrel оказывается несколько медленнее в среднем, чем PABCSystem, но взамен при её использовании мы получаем большую гибкость и устойчивость вывода.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
22.11.2019, 11:55  [ТС] 5
Доступен NETSquirrel 0.0.30 [Night build].

Минимальные требования:
- NETCore: 2.2
- NET: 4.5

Зависимости:
- NuGet пакет System.ValueTuple 4.5.0

Улучшения:
- ReadBoolMatrix c делегатом FuncExceptionHandler
- ReadBoolArray c делегатом FuncExceptionHandler
- расширения PrintBy/PrintLineBy/PrintLinesBy для IEnumerable<T> с селектором типа Func<T, int, TResult>
- расширения Print/PrintLine/PrintLines для IEnumerable<T> с селектором типа Func<T, int, TResult>
- расширения Print/PrintLine/PrintLines для IEnumerable<T> с селектором

Пример:
C#

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using NETSquirrel.Extensions;
using NETSquirrel.Utils;
 
namespace Test
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            MatricesUtils.ReadIntMatrix(10, 10, e => true, true, "item [{0}, {1}]:").PrintAsMatrix();
        }
    }
}

Visual Basic.NET
vb.net
1
2
3
4
5
6
7
8
Imports NETSquirrel.Extensions
Imports NETSquirrel.Utils
 
Module Module1
    Sub Main()
        MatricesUtils.ReadIntMatrix(10, 10, Function(e) True, True, "item [{0}, {1}]:").PrintAsMatrix()
    End Sub
End Module

Managed C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "pch.h"
using namespace NETSquirrel;
using namespace NETSquirrel::Utils;
using namespace NETSquirrel::Extensions;
 
using namespace System;
 
using Ut = MatricesUtils;
using Ex = MatricesExtensions;
 
bool Function(Exception ^e)
{
    return true;
}
 
int main(array<System::String^>^ args)
{
    auto x = Ut::ReadIntMatrix(10, 10, gcnew FuncExceptionHandler(&Function), true, "item [{0}, {1}]:");
    Ex::PrintAsMatrix(x, ", ");
    return 0;
}

PascalABC.NET
Pascal
1
2
3
4
5
6
{$reference NETSquirrel.dll}
uses NETSquirrel.Utils;
 
begin
  MatricesUtils.ReadIntMatrix(10, 10, e -> true, true, 'item [{0}, {1}]:').PrintAsMatrix();
end.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
23.11.2019, 12:46  [ТС] 6
Решение задачи через NETSquirrel 0.0.30:
Определить номер последнего из элементов массива равных 5.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using NETSquirrel.Extensions;
using static System.Array;
using static NETSquirrel.Utils.ArraysUtils;
using static NETSquirrel.Utils.BaseTypesUtils;
 
namespace Test
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            var a = ReadDoubleArray(ReadInt("Count:"), e =>
            {
                "Please enter a number, not a string.".PrintLine();
                return true;
            });
            FindLastIndex(a, x => x == 5).PrintLine();
        }
    }
}
Проблемы:
- При вводе строки, вместо числа (при указании количества элементов массива) произойдёт падение программы. Решение: добавить try-catch.
- При вводе отрицательного количества элементов массива будет выброшено исключение. Решение: вынести считывание элементов массива в переменную и проверять введённое число на неотрицательность.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
02.12.2019, 17:53  [ТС] 7
Доступен NETSquirrel 0.0.35 [Night build].

Минимальные требования:
- NETCore: 2.2
- NET: 4.5

Зависимости:
- NuGet пакет System.ValueTuple 4.5.0

Улучшения:
- Расширения для кортежей для создания матриц
- Расширения для int для создания массивов
- Неявное преобразование int -> SliceSpan
- Срезы для строк
- Утилитные методы с FuncExceptionHandler для чтения кортежей с клавиатуры

Пример:
C#

C#
1
2
3
4
5
6
7
8
9
10
11
12
using NETSquirrel.Extensions;
 
namespace Test
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            "Hello world!".Slice((0, 5, 2), x => (char)(x + 2)).PrintLine();
        }
    }
}

Visual Basic.NET
vb.net
1
2
3
4
5
6
7
Imports NETSquirrel.Extensions
 
Module Program
    Sub Main(args As String())
        Call "Hello world!".Slice((0, 5, 2), Function (x) Convert.ToChar(Convert.ToInt32(x) + 2)).PrintLine()
    End Sub
End Module

PascalABC.NET
Pascal
1
2
3
4
5
6
{$reference NETSquirrel.dll}
uses NETSquirrel;
 
begin
  'Hello world!'.Slice(new SliceSpan(0, 5, 2), x -> char(integer(x) + 2)).PrintLine();
end.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
23.12.2019, 15:39  [ТС] 8
Примеры для NETSquirrel 0.35 готовы на C# и PascalABC.NET.
0
Эксперт .NET
8676 / 6136 / 1022
Регистрация: 21.01.2016
Сообщений: 23,159
24.12.2019, 06:19 9
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Минимальные требования:
- NETCore: 2.2
Не совсем адекватные требования. Срок поддержки 2.2 уже истекает, а 2.1 ещё живой. Может лучше было нацеливаться на .NET Standart 2.0 ?
1
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
24.12.2019, 08:30  [ТС] 10
Usaga, да, согласен. Хорошее предложение.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
24.12.2019, 21:15  [ТС] 11
Начиная с NETSquirrel 0.40 проект переходит на NET Standard 2.0.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
28.12.2019, 17:10  [ТС] 12
Специальные символы для управления условной компиляцией:
- IS_PASCALABCNET_COMPATIBLE - включает атрибуты к членам классов, позволяющих генераторам кода для PascalABC.NET
выбирать наиболее подходящие названия для методов и свойств.
- UTILS_WITH_EXCEPTION_HANDLER_SUPPORT_ARE_ENABLED - включает поддержку утилитных методов с обработкой исключений.
0
Администратор
Эксперт .NET
13129 / 10696 / 4413
Регистрация: 17.03.2014
Сообщений: 21,535
Записей в блоге: 1
02.01.2020, 20:47 13
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Специальные символы для управления условной компиляцией
Зачем они пользователям библиотеки? Люди же будут пользоваться уже откомпилированной сборкой.
1
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
02.01.2020, 23:04  [ТС] 14
OwenGlendower, пользователям - да, не нужны. Разработчикам - могут понадобится, чтобы получать специфические сборки, заточенные под их нужны.

Добавлено через 2 минуты
Старый функционал NETSquirrel перенесён в библиотеку NETSquirrelBC.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
03.02.2020, 05:05  [ТС] 15
Теперь пользователи могут оставлять отзывы мне в Яндекс-форме, а получать ответ с NETMouseProjects@yandex.ru, поскольку все данные форм автоматически отправляются на данную почту. Название Вашей OC и её версия передаются мне автоматически - вручную указывать не надо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2020, 05:05

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Почему нет раздела (подраздела) ASP.Net Core?
Почему нет раздела ASP.Net Core? Почему нет раздела СMS для .net?

Меня одного удивляет отсутствие здесь раздела .NET Core ?
Меня одного удивляет отсутствие здесь раздела .NET Core ?

Как указать VS.NET какой из установленный .NET Framewrok SDK использовать
У меня есть дистрибутив VS.NET2002. При инсталляции он ставит .NET Framewrok SDK v1.0.3705 Я...

Как установить .NET приложение, но без установки самого .NET Framework?
Мне нужно установить .NET приложение, но без установки самого .NET Framework. Возможно ли это? есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.