В LISP часто существует требование использовать самые слабые конструкции. Некоторые руководства по стилю скажут Вам использовать =
, а не eql
, когда Вы будете знать, что сравненные объекты являются числовыми, например. Идея состоит в том, чтобы часто указывать то, что Вы имеете в виду, а не программируете компьютер эффективно.
Однако могут быть фактические улучшения эффективности высказывания только, что Вы имеете в виду, и не использование более сильных конструкций. Если у Вас есть инициализации с LET
, они могут быть выполнены параллельно, в то время как LET*
инициализации должны быть выполнены последовательно. Я не знаю, сделают ли какие-либо реализации на самом деле это, но некоторые могут хорошо в будущем.
Хотя это не совсем то, что вы хотите (по причинам, указанным в ответе Gamecat), для вас может быть жизнеспособным обходным путем инициализировать динамический массив данных:
var Data:TDoubleMatrix;
begin
Data:=TDoubleMatrix.create(TDoubleArray.create(0,0,0,0),
TDoubleArray.create(0,0,1,1),
TDoubleArray.create(1,0,1,0),
TDoubleArray.create(1,1,0,0),
TDoubleArray.create(1,1,1,1));
end;
Динамические массивы отличаются от обычных массивов.
Динамические массивы - это указатели, а обычные массивы - это блоки памяти. С одномерными массивами вы можете использовать адрес массива. Но с многомерными массивами этот трюк не сработает.
В вашем случае я бы использовал файл для инициализации массива. Таким образом, вы можете использовать динамические массивы в 100% случаев. В противном случае вам придется написать собственное преобразование, которое не позволяет использовать динамические массивы.
Может быть, вам лучше использовать открытые массивы вместо?
Вы не можете разыграть, но можете скопировать! Что-то вроде ...
procedure CopyDMatrix(var Source; LengthX, LengthY: integer; var Dest: TDoubleMatrix);
const
SizeOfDouble = SizeOf(Double);
var
n : integer;
ptr: pointer;
begin
SetLength(Dest, LengthX);
Ptr := @Source;
for n := 0 to LengthX - 1 do begin
SetLength(Dest[n], LengthY);
Move(ptr^, Dest[n][0] , SizeOfDouble * LengthY);
inc(cardinal(ptr), SizeOfDouble * LengthY);
end;
end;
//...
CopyDMatrix(Data, Length(Data), Length(Data[0]), DoubleMatrix);