Я хочу, чтобы вопросы, подобные данному, не возникали. Ведь был же снят вопрос о том, имеет место рекурсия или присваивание в теле описываемой функции за счет возможности в подобных случаях использовать переменную Result в правой части оператора присваивания и тем самым однозначно указать, что тут не рекурсия. Либо, напротив, использовать имя функции, чтобы вызвать рекурсию.
Наверно можно и в других случаях при возникновении коллизий выдать подобные рекомендации.
По поводу Вашего вопроса
var a := i.ToString
Я думаю, что тут сложно сказать что-то о типе a, пока неизвестно, что такое i. Если i - простая переменная, за которой спрятано некоторое значение, то я ожидаю, что a будет строкой, которая изобразит это значение в символьном виде. А вот если i - некий объект, представляющий собой структуру из нескольких более простых компонентов (например, последовательность или даже просто кортеж из пары полей), то тут все зависит от задумок разработчика. Но уж наверно все же это не будет символьной строкой, содержащий весь набор значений из упомянутой структуры, как это было бы при использовании JoinIntoString. Возможно, стоит просто выдать сообщение об ошибке на стадии компиляции и запретить использовать .ToString для объектов сложной структуры. Это лучше, чем получать выдачи типа System.Linq.Enumerable+d__b8
Подробная информация об использовании оперативной
(JIT) отладки вместо данного диалогового
окна содержится в конце этого сообщения.
************** Текст исключения **************
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в VisualPascalABC.RunManager.WritelnStringToProcess(String id, String data)
в VisualPascalABC.WorkbenchRunService.SendInputTextToProcess()
в System.Windows.Forms.Control.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ButtonBase.WndProc(Message& m)
в System.Windows.Forms.Button.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Загруженные сборки **************
mscorlib
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
PascalABCNET
Версия сборки: 3.2.0.1399
Версия Win32: 3.2.0.1399
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PascalABCNET.exe
----------------------------------------
System
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Core
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
// PascalABC.NET 3.2, сборка 1399 от 08.03.2017
type
pair=record
x,y:integer
end;
begin
var n:=10;
var a:=new pair[n];
for var i:=1 to n-1 do begin a[i].x:=i; a[i].y:=10*i end;
Writeln(a);
Writeln(a.Select(e->e.x+e.y).Sum)
end.
Эта программа нормально работает.
А вот так при компиляции возникает ошибка.
type
pair=record
x,y:integer
end;
begin
var n:=10;
var a:=new pair[n];
for var i:=1 to n-1 do
with a[i] do begin x:=i; y:=10*i end;
Writeln(a);
Writeln(a.Select(e->e.x+e.y).Sum)
end.
Казалось бы, надо грешить на внешне вполне корректный оператор with.
Но, если удалить оператор Writeln(a.Select(e->e.x+e.y).Sum), программа компилируется и работает нормально.
И это будет вполне разумно. Вот как раз подобный набор запретов или рецептов, как поступать при различных накладках, я имел в виду, если ответить на Ваш вопрос
Со скобками - другая ситуация, она более спорная. А тут - 2 мира - очень старый и новый - и куча времени потратить чтобы их подружить. А можно не тратить.
Возвращаюсь к своему примеру:
function q: integer;
begin
Result := 1;
end;
begin
var a: integer := q;
Println(a.GetType);
var b: ()->integer := q;
Println(b.GetType);
end.
Я хочу подчеркнуть, что у нас - сложные правила. Если хотим, чтобы q считалась вызовом, то описываем a как integer. Но если хотим переменную b считать указателем на функцию, то указываем тип указателя на функцию без параметров, возвращающую integer, и тогда q приводится к типу указателя.
И? Главное, чтобы имелся способ (“рецепт”) однозначно связать желание программиста с возможностями компилятора. А если при этом максимально сохраняется совместимость со школьным Паскалем - это вообще превосходно. Либо, как я уже предлагал, сделать опцию “ISO” (флажком в настройках) , с выбором которой Паскаль будет работать в урезанном варианте на переходный период.
Не так давно мне один школьник написал на тему “for var i:=…”, что у них учитель ЗАПРЕТИЛ пользоваться PascalABC.NET, потому что он содержит ошибки, выдавая какие-то “нелепые сообщения” в программе, взятой из действующего школьного учебника. Это вот как раз о том, что я когда-то писал: сообщения о подобных отходах от “классики” дают козыри противникам внедрения PascalABC.NET. Опция “ISO” зарубила бы эти возражения на корню.
И еще, возможно стоит подумать о ребрендинге. Pascal ABC и PascalABC.NET вносят путаницу. потому что большинство учащихся называют версию PascalABC - так проще выговаривать и удобнее писать. Зато нельзя понять, что именно человеку надо. Более того, многие школьники даже НЕ ЗНАЮТ, что между этими диалектами языка есть разница, потому что и учителя говорят: Турбопаскаль, Фрипаскаль, Дельфи, ПаскальАБЦ.
Прекрасно. Запрет - это прекрасно. Это - хорошее средство выявить больных на голову учителей. Их не исправит режим ISO. Пусть учат программировать на синеньком экранчике.
У нас кстати есть еще предупреждения о неиспользуемых переменных. За них тоже надо запрещать я считаю. И - двойка в четверти чтобы неповадно было.
А что такое Pascal ABC? Это какой-то пакет?
Я вот тоже в обыденной речи произношу ПаскальАБЦ, имея в виду PascalABC.NET. Так что, не вижу в этом ничего криминального.
Подробная информация об использовании оперативной
(JIT) отладки вместо данного диалогового
окна содержится в конце этого сообщения.
************** Текст исключения **************
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в VisualPascalABC.RunManager.WritelnStringToProcess(String id, String data)
в VisualPascalABC.WorkbenchRunService.SendInputTextToProcess()
в VisualPascalABC.OutputWindowForm.InputTextBox_KeyDown(Object sender, KeyEventArgs e)
в System.Windows.Forms.Control.OnKeyDown(KeyEventArgs e)
в System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
в System.Windows.Forms.Control.WmKeyChar(Message& m)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.TextBox.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Загруженные сборки **************
mscorlib
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
PascalABCNET
Версия сборки: 3.2.0.1400
Версия Win32: 3.2.0.1400
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PascalABCNET.exe
----------------------------------------
System
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Core
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Windows.Forms
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
PluginsSupport
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PluginsSupport.DLL
----------------------------------------
CompilerTools
Версия сборки: 3.2.0.1400
Версия Win32: 3.2.0.1400
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/CompilerTools.DLL
----------------------------------------
WeifenLuo.WinFormsUI.Docking
Версия сборки: 2.2.5489.36547
Версия Win32: 2.2.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/WeifenLuo.WinFormsUI.Docking.DLL
----------------------------------------
Compiler
Версия сборки: 3.2.0.1400
Версия Win32: 3.2.0.1400
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/Compiler.DLL
----------------------------------------
Localization
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/Localization.DLL
----------------------------------------
System.Configuration
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Windows.Forms.resources
Версия сборки: 4.0.0.0
Версия Win32: 4.0.30319.36213 built by: FX452RTMLDR
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
ICSharpCode.TextEditor
Версия сборки: 0.0.0.0
Версия Win32: 0.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.TextEditor.DLL
----------------------------------------
CodeCompletion
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/CodeCompletion.DLL
----------------------------------------
ParserTools
Версия сборки: 3.2.0.1400
Версия Win32: 3.2.0.1400
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ParserTools.DLL
----------------------------------------
Accessibility
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
Errors
Версия сборки: 3.2.0.1400
Версия Win32: 3.2.0.1400
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/Errors.DLL
----------------------------------------
SyntaxTree
Версия сборки: 3.2.0.1400
Версия Win32: 3.2.0.1400
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/SyntaxTree.DLL
----------------------------------------
ICSharpCode.SharpDevelop
Версия сборки: 4.2.1.0
Версия Win32: 4.2.1.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.SharpDevelop.DLL
----------------------------------------
ICSharpCode.Core
Версия сборки: 4.2.1.0
Версия Win32: 4.2.1.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.Core.DLL
----------------------------------------
ICSharpCode.SharpDevelop.Dom
Версия сборки: 4.2.1.8805
Версия Win32: 4.2.1.8805
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.SharpDevelop.Dom.DLL
----------------------------------------
ICSharpCode.NRefactory
Версия сборки: 4.2.1.8805
Версия Win32: 4.2.1.8805
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.NRefactory.DLL
----------------------------------------
ICSharpCode.AvalonEdit
Версия сборки: 4.2.1.8805
Версия Win32: 4.2.1.8805
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.AvalonEdit.DLL
----------------------------------------
ICSharpCode.Core.Presentation
Версия сборки: 4.2.1.0
Версия Win32: 4.2.1.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.Core.Presentation.DLL
----------------------------------------
ICSharpCode.SharpDevelop.Widgets
Версия сборки: 4.2.1.8805
Версия Win32: 4.2.1.8805
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.SharpDevelop.Widgets.DLL
----------------------------------------
ICSharpCode.Core.WinForms
Версия сборки: 4.2.1.0
Версия Win32: 4.2.1.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.Core.WinForms.DLL
----------------------------------------
System.Design
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Design/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Design.dll
----------------------------------------
Debugger.Core
Версия сборки: 3.0.0.2649
Версия Win32: 3.0.0.2649
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/Debugger.Core.DLL
----------------------------------------
System.Data
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_64/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
mscorlib.resources
Версия сборки: 4.0.0.0
Версия Win32: 4.0.30319.33440 built by: FX45W81RTMREL
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
TreeConverter
Версия сборки: 3.2.0.1400
Версия Win32: 3.2.0.1400
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/TreeConverter.DLL
----------------------------------------
NETGenerator
Версия сборки: 3.2.0.1400
Версия Win32: 3.2.0.1400
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/NETGenerator.DLL
----------------------------------------
SyntaxTreeConverters
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/SyntaxTreeConverters.DLL
----------------------------------------
SemanticTree
Версия сборки: 3.2.0.1400
Версия Win32: 3.2.0.1400
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/SemanticTree.DLL
----------------------------------------
System.Numerics
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll
----------------------------------------
PascalABCParser
Версия сборки: 0.0.0.0
Версия Win32: 0.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PascalABCParser.DLL
----------------------------------------
OptimizerConversion
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/OptimizerConversion.DLL
----------------------------------------
InternalErrorReport
Версия сборки: 1.0.6281.41849
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/InternalErrorReport.DLL
----------------------------------------
PT4Provider
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PT4Provider.DLL
----------------------------------------
PT4Tools
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PT4Tools.DLL
----------------------------------------
SyntaxVisitors
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/SyntaxVisitors.DLL
----------------------------------------
YieldConversionSyntax
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/YieldConversionSyntax.DLL
----------------------------------------
YieldHelpers
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/YieldHelpers.DLL
----------------------------------------
System.Security
Версия сборки: 4.0.0.0
Версия Win32: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Security/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Security.dll
----------------------------------------
************** Оперативная отладка (JIT) **************
Для подключения оперативной (JIT) отладки файл .config данного
приложения или компьютера (machine.config) должен иметь
значение jitDebugging, установленное в секции system.windows.forms.
Приложение также должно быть скомпилировано с включенной
отладкой.
Например:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
При включенной отладке JIT любое необрабатываемое исключение
пересылается отладчику JIT, зарегистрированному на данном компьютере,
вместо того чтобы обрабатываться данным диалоговым окном.
Я залил версию с более подробной диагностикой этой ошибки.
Пожалуйста, скачайте повторно и запустите программу. Будет ошибка, но другая. Скопируйте сюда несколько первых строчек сообщения об ошибке.
Для работы вкупе с лямбдой, когда она пытается захватить содержимое, возможно это и пережиток.
Но в целом часто сильно сокращает запись программы.
Сравним:
type
Point=record
x,y:real
end;
Line=record
a,b:Point
end;
PolyLine=array[1..5] of Line;
begin
var myPolyLine:=new PolyLine[4];
(myPolyLine[0][1].a.x,myPolyLine[0][1].a.y):=(1,2);
(myPolyLine[0][1].b.x,myPolyLine[0][1].b.y):=(-3.5,9);
Writeln(myPolylIne[0][1])
end.
и “анахронизм”
type
Point=record
x,y:real
end;
Line=record
a,b:Point
end;
PolyLine=array[1..5] of Line;
begin
var myPolyLine:=new PolyLine[4];
With myPolyLine[0][1] do begin
(a.x,a.y):=(1,2);
(b.x,b.y):=(-3.5,9)
end;
Writeln(myPolylIne[0][1])
end.
Другое дело, что изначально в Паскале было принято неудачное решение с квалификаторами внутри With:
type
Point=record
x,y:integer
end;
begin
var x:=0;
var P:Point;
With P do begin
y:=2;
//...
// ...
x:=1 // к этому моменту можно и запутаться, о каком х речь идет.
// кроме того, нельзя воспользоваться "обычным" х
end;
Println(x,P);
end.
В этом смысле Майкрософт с VB/VBA поступила умнее:
Public Type Point
x As Integer
y As Integer
End Type
Sub Test()
Dim P As Point
x = 0
With P
.x = x + 1 'Нет вопроса, где какой "х"
.y = 2
MsgBox Str(x) + Str(.x) + Str(.y)
End With
End Sub
Всего лишь наличие префиксной точки радикально решает проблему.