NETSquirrel - вопросы и ответы

А в целом приходилось задумываться над тем, часто ли нужны вызовы различных методов с одними и теми же параметрами? Ведь большинство объектов несет всю нужную информацию в своих полях.

Да, приходилось. И не думаю, что это первостепенная фишка библиотеки. Я не видел подобных вещей в других библиотеках, что наводит на мысль, что такой функционал не сильно нужен. Хотя, всегда хочется иметь некоторый “запас”.

Да, именно так. Но, бывают случаи-исключения. Например, просто требуется создать два массива, читаемых с клавиатуры. Дублировать параметры - не хочется, писать лишние константы - тоже, хочется иметь возможность быстро сгруппировать единожды некие параметры для метода в какой-то простой объект, а затем иметь возможность их переиспользовать. Разумеется, встаёт вопрос о том, что магические числа всё равно используются, хоть и реже, при данном подходе. Возможно, при неверном использовании такого функционала код можно испоганить - будет слишком много магических чисел. Однако, неверно использовать можно всё, что угодно… Неплохим решением будет составить рекомендации по использованию всего функционала библиотеки, чтобы пользователи знали каких правил придерживаться, но в то же время, они не навязывались, да и поскольку, как Вы когда-то здесь сказали в отношении PascalABC.NET - рекомендации могут быть, но стандарт нет - слишком много “мороки” (это работает в и отношении NETSquirrel - как open-source проекта).

Вот тут я не совсем понял. Если массив читается с клавиатуры - причем тут параметры? Если речь о размерах массива - ну хорошо два массива, что, так сложно сдублировать строку с кодом для второго из них? Это быстрее, чем набрать строку вызова метода. Т.е. можно, конечно, придумать вымороченный пример, где это будет полезно, но стоит ли ради таких случаев городить огород?

Дело в том, что в параметрах указывается не только размер, но можно также указать обработчик ошибки, если, например, во время чтения массива чисел будет введена строка и формат подсказки для ввода каждого элемента.

Ну так и? Вот и скопируйте всю строку.

Я тоже задумывался над таким вопросом. С одной стороны - хотелось бы иметь запас функционала, с другой - это всё-же лишняя поддержка, в то время как силы могут потрачены на иные более полезные вещи. В общем, пока это всё на стадии размышлений, но полезность - сомнительная… Также есть мысль следующая: NETSquirrel не гонится за краткостью, так, как это делает PABCSystem - по названиям методов и классов - заметно, точнее - снова вопрос: Стоит ли реализовывать данный функционал, ради краткости? Именно поэтому, я спрашивал также и @Admin, поскольку он - преподаватель и ему известны потребности учащихся, на которых, возможно, была бы ориентирована данная фишка библиотеки.

2 лайка

Поступило предложение сделать методы расширения для матриц и jagged-массивов (array of array of T):

  • T[,] ToMatrix<T>(this T[][] array) и TOutput[,] ToMatrix<T, TOutput>(this T[][] array, Func<T, TOutput>)
  • T[][] ToJagged<T>(this T[,] matrix) и TOutput[][] ToJagged<T, TOutput>(this T[,] matrix, Func<T, TOutput>)
  • T[,] Transpose<T>(this T[,] matrix) и TOutput[,] Transpose<T, TOutput>(this T[,] matrix, Func<T, TOutput>)

Лично я думаю над внедрением ещё:

  • SelectManyAsMatrix

У кого и какие есть ещё предложения (@Admin, @ibond, @RAlex, @Sun_Serega, @Kotov, @Valery)?

Обновил шаблон кода NETSquirrel для PascalABC.NET:

{$reference NETSquirrel.dll}

{$define DataStructures}
{$define Debug}
{$define Extensions}
{$define Utils}
{$define PascalABCNETUnits}

{$region NETSquirrel namespaces}
uses NETSquirrel;

{$ifdef DataStructures}
uses NETSquirrel.DataStructures;
uses NETSquirrel.DataStructures.Generic;
uses NETSquirrel.DataStructures.Immutable;
uses NETSquirrel.DataStructures.Generic.Immutable;
{$endif}

{$ifdef Debug}
uses NETSquirrel.Debug;
uses NETSquirrel.Debug.Generic;
{$endif}

{$ifdef Extensions}
uses NETSquirrel.Extensions;
uses NETSquirrel.Extensions.ConsoleSpecific;
{$endif}

{$ifdef Utils}
uses NETSquirrel.Utils;
{$endif}
{$endregion}
{$region Pascal Units}
{$ifdef PascalABCNETUnits}
uses GeneralExtensions;
uses TuplesExtensions;
uses NumericsExtensions;
{$endif}
{$endregion}

begin
  // code here
end.

Теперь можно подключать несколько пространств имён сразу посредством использования {$define ...}.

Перейти к содержанию

Набор сниппетов для PascalABC.NET, адаптированный под NETSquirrel. Список:

  • block
  • region
  • if, ifelse
  • loop, for, forr, while, repeat
  • foreach
  • procedure, function
  • lock
  • trye, tryf
  • class, record, interface
  • library, unit
  • prop, propg, props, aprop
  • netsquirrel
  • ComparerOf, EqualityComparerOf, ArrayOf, DictionaryOf, HashSetOf, KeyValuePairOf, LinkedListOf, LinkedListNodeOf, ListOf, SortedDictionaryOf, SortedListOf, SortedSetOf, QueueOf, StackOf [для GeneralExtensions]
  • ValueTupleOf [для TuplesExtensions]
  • ReadComplex, ReadVector2, ReadVector3, ReadVector4, ReadMatrix3x2, ReadMatrix4x4 [для NumericsExtensions]
  • сниппеты для пространства имён NETSquirrel.Utils, представляющие собой имена соответствующих методов (пример: GenerateArray)

Вначале располагаются общие сниппеты, после - для расширений NETSquirrel на PascalABC.NET, последние - для оригинальной NETSquirrel.

template.pct (7.4 KB)

Перейти к содержанию

Создан репозиторий для сниппетов PascalABC.NET.

Обновлён пакет сниппетов для PascalABC.NET до версии v0.0.17.2-6. Добавлены сниппеты:

  • для методов класса NETSquirrel.Extensions.ObjectExtensions
  • для всех директив компилятора
  • для методов класса NETSquirrel.Extensions.BaseTypesExtensions
  • для методов класса NETSquirrel.Extensions.TuplesExtensions
  • для автоклассов - aclass

Скачать PascalABC.NET Snippets v0.0.17.2-6

Пример использования:

  1. Набор ifdefelse.
  2. Нажатие Shift+Space.
  3. Результат:
{$ifdef |}

{$else}

{$endif}

| - текущая позиция курсора.

Перейти к содержанию

Как заменить стандартный набор сниппетов на сторонний?

  1. Откройте GitHub.
  2. Скачайте в разделе Releases нужную Вам версию пакета сниппетов NETSquirrel.
  3. Переместите скачанный .pct файл в директорию C:\Program Files (x86)\PascalABC.NETC:\Program Files (x86)\PascalABC.NET, заменив стандартный template.pct при этом.

Как создать собственный набор сниппетов?

  1. Создайте файл с названием template.txt.
  2. Смените расширение файла на .pct.
  3. Откройте файл и вставьте следующий шаблон:
[SnippetName]
code

SnippetName - имя сниппета, которое потребуется набрать в IDE PascalABC.NET (регистр не важен) для вставки ниже написанного кода, подписанного как code.

  1. Укажите позицию курсора, в которую он переместится (в пределах кода сниппета) после его вставки в IDE посредством |.
  2. После наполнения файла template.pct, созданного Вами, желаемыми сниппетами замените стандартный одноимённый файл в директории C:\Program Files (x86)\PascalABC.NETC:\Program Files (x86)\PascalABC.NET.
  • Для редактирования изначального template.pct требуется запуск текстового редактора с правами администратора.

  • Во всех случаях для проверки внесённых изменений требуется перезапуск IDE.

Перейти к содержанию

Количество голосов: 181, средняя оценка: 4.98. Просмотров: 32792. Самая высокая оценка на всё время на данный момент.

Как для разработчика, для меня это - приятная новость. Поэтому, в планах:

  • доделать сниппеты для PascalABC.NET и сделать аналогичные для Visual Studio
  • сделать библиотеку-ответвление проекта GraphicsABC - более простой аналог GraphABC, и для любого NET языка
  • сделать библиотеку-ответвление проекта ObjectsABC - более простой аналог ABCOObjects, и для любого NET языка
1 лайк

Обновлён пакет сниппетов для PascalABC.NET до версии v0.0.17.2-10. Добавлены сниппеты:

  • case, match
  • indexer, indexerg, indexers
  • для методов-расширения класса NETSquirrel.Extensions.MatricesExtensions
  • для методов-расширения класса NETSquirrel.Extensions.IEnumerableExtensions

Скачать PascalABC.NET Snippets v0.0.17.2-10

Перейти к содержанию

Требуется узнать в каком формате лучше предоставлять сниппеты:

[if] 
if | then 
begin 

end; 

[case] 
case | of 
: ; 
else 
end; 

[for] 
for var i := 0 to | do 
begin 

end;

или:

[if] 
if |{condition} then 
begin 
  {statements}
end; 

[case] 
case |{variable} of 
  {values set}: {statements}; 
  else {statements}
end; 

[for] 
for var i := 0 to |{high border} do 
begin 
  {statements}
end;

Первый вариант - меньше править при заполнении сниппета конкретными значениями, но также и меньше его информативность. Второй - больше править при заполнении сниппета, но также и больше информативность.

  • Первый
  • Второй
  • Желаю предложить свой

0 голосов

Весь смысл снипетов - увеличивать скорость написания кода. А что делают конструкции языка должно объясняться в справке, а не где попало. Тем более если человек не понимает что такое case - он точно не поймёт что такое statements. Всё же это сложный термин, ещё и на англ.

3 лайка

Кто голосовал за второй вариант - прошу откликнуться и аргументировать свою точку зрения.

Да аргумент простой: человеческая натура. Чтобы работало без разных там RTFM.

1 лайк

Ну, если делать как в студии, где подсказки сами пропадают - нормально. Но это будет довольно не удобно, если после каждого b+Shift+Space придётся удалять какую то часть кода.

И - скажите ка какой у вас опыт использования снипетов.

Пока - опыт исключительно отрицательный. Мешают…