Здесь весь паскаль .Net, а значит весь управляемый.
Как реализовать:
ref - через var-параметры.
out - тоже через них попробуйте, но даже если прокатит - защиты от дурака вроде "out переменной надо присвоить значение до выхода из метода" вы не получите.
function MyMethod<T>(self: IEnumerable<T>): sequence of T; extensionmethod;//sequence of T это синоним IEnumerable<T>
begin
yield self.First;
yield sequence self.Where(
o->
o<>default(T)
);
end;
А перед тем как задавать следующие вопросы - прочтите справку. Она слабенькая, но вы хотя бы о синтаксисе классов, наследования и т.п. прочтите, чтоб понимать что вообще происходит.
.dll должна всегда быть в папке с исходниками. Иначе даже если бы скомпилировалось - .exe не запустился бы, ибо не нашёл бы .dll . Но ошибка странная да…
Такой вот каменный цветок. Собралось, осталось испытать. Моя первая программа на управляемом паскале.
library MyPlugin;
{$reference SMath.Controls.dll}
{$reference SMath.Manager.dll}
{$reference SMath.Math.Numeric.dll}
{$reference SMath.Math.Symbolic.dll}
interface
uses System, System.Collections.Generic;
uses SMath.Manager, SMath.Math, SMath.Math.Numeric;
type
Plugin = class( IPluginMathNumericEvaluation )
public
procedure Initialize();
procedure Dispose();
function GetTermsHandled( sessionProfile: SMath.Manager.SessionProfile ): array of TermInfo;
function NumericEvaluation( value: Term; args: array of TNumber; var res: TNumber ): boolean;
end;
implementation
function Plugin.GetTermsHandled( sessionProfile: SMath.Manager.SessionProfile ): array of TermInfo;
begin
Result := new TermInfo[0];
end;
function Plugin.NumericEvaluation( value: Term; args: array of TNumber; var res: TNumber ): boolean;
begin
Result := False;
end;
procedure Plugin.Initialize();
begin
end;
procedure Plugin.Dispose();
begin
end;
begin
end.
На самом деле это пока заготовки. Теперь нужно численную функцию определить и проверить её работу в математической программе.
А как насчёт переменного количества параметров? Такое вот:
private void Log( string format, params object[] list )
{
var text = string.Format( format, list );
var now = DateTime.Now;
var time = now.ToLongTimeString();
var date = now.ToShortDateString();
text = string.Format( "{0} {1} {2}{3}", date, time, text, Environment.NewLine );
try
{
File.AppendAllText( LogFile, text, Encoding.UTF8 );
}
catch { }
}
Да, что-то не получилось добавить. Это нужно для явного задания guid в тексте программы. Иначе его потом доставать нужно, если в метаданных указывается именно этот атрибут. Дело в том, что работа с плагинами в SMath Studio идёт через эти идентификаторы и лучше его знать и определять в явном виде.
В общем, довольно неплохо для такой небольшой среды разработки. Я впечатлён.
П.С. Хотя ограничение можно обойти, если оформить сборки в виде “вторичных” плагинов. Написать основной менеджер в виде плагина на c#, который будет подгружать паскалевские сборки. Это идея.
Ещё такой вопрос. Ведь у .Net сборки вроде бы как нет точки входа. Обязателен ли begin и end в конце? Когда он будет срабатывать? Или получаемая сборка похожа на C++/CLI? Т.е. она не чисто управляемая?