Из Monkey1 в Monkey2

Привет,

Краткий список того, что следует учитывать при конвертации кода monkey1 в код monkey2…

Строгий режим больше не опционален!

Все функции, возвращающие значения должны делать это! В monkey1 вы могли опустить инструкцию возврата, даже если функция возвращала непустое значение. В monkey2 это недопустимо (пока еще не реализовано в компиляторе)

Переменные больше не являются целочисленными по умолчанию - все объявления переменных должны либо определять их тип, либо инициализировать переменную, например:

Local blah 'не будет работать в monkey2!

Local blah:Int 'работает в monkey1 и monkey2.

Local blah:=10 'работает в monkey1 и monkey2 - blah это Int.

Local blah:Int=10 'работает в monkey1 и для monkey2

В объявлениях методов и функций все еще можно опускать тип возвращаемого значения, однако по умолчанию, тип возвращаемого значения в monkey2 - void (в отличии от Int в monkey1)

Сокращенные спецификаторы типов monkey1 (например:% для целочисленных типов данных и # для чисел с плавающей точки) не поддерживаются в monkey2 - необходимо использовать ”:Int”, “:Float” и т.д.

Использование пространства имен и импорт файлов

Monkey2 привносит систему “пространства имен” в monkey1. Это означает, что каждое объявление относится к какому-либо пространству имени. Никаких глобальных объявлений.

Самый простой начать работать c ними - добавить в начало вашего исходного кода:

#Import "<std>"
#Import "<mojo>"
Using std..
Using mojo..

Это позволит вам получить доступ ко всем объявлениям в пространствах имен std и mojo.

Для импорта файла исходного кода monkey2 в сборку, используйте директиву препроцессора #Import, например:

#Import "file2"

Если вы не указываете расширение, то #Import определяет его как ‘monkey2’, таким образом импортируется файл “file2.monkey2”.

Параметры вызываемой функции должны заключаться в скобки

В monkey1 вы могли (обычно) не заключать в скобки параметры вызываемой функции, например:

DrawImage image,x,y 'не будет работать monkey2!

В monkey2 это недопустимо – все параметры функции должны быть в скобках, например:

DrawImage( image,x,y ) 'работает в monkey1 и monkey2

Изменения в синтаксисе создания массива

Monkey1 допускает “быструю” форму конструктора массива:

Local tmp:Int[10] 'не сработает monkey2!

В monkey2 вам необходимо использовать более длинную (но аналогичную) форму:

Local tmp:=New Int[10] 'работает в monkey1 и monkey2!

Так же, чтобы создать массив с предопределенными элементами, используйте:

Local tmp:=New Int[]( 1,2,3,4 )   'работает только в monkey2 - создает массив длинной в 4 элемента.

Это заменяет старый [значение0,значение1,значение2…] синтаксис.

Виртуальные и переопределенные методы должны должны быть явно помечены таковыми

В monkey1, все не финальные методы автоматически являются виртуальными и могут (иногда случайно) динамически переопределять существующие методы. В monkey2 виртуальные и переопределенные методы должны быть явно помечены следующим образом:

Class Base
   Method Update() Virtual
   End
End

Class Derived Extends Base
   Method Update() Override
   End
End

Изменение синтаксиса объявления свойств

При объявлении свойств нужно будет использовать новый синтаксис. Вместо этого…

Method MyProp:String() Property 'monkey1 'геттер'
End

Method MyProp( arg:String ) Property  'monkey1 'сеттер'
End

…необходимо использовать…

Property MyProp:String() 'только в monkey2!
Setter( myProp:String )
End

Обработка конца строки

Сейчас с концом строки в Monkey2 все очень строго. Все блокирующие объявления (Class, Method, Property, Function) и инструкции (If, While, Repeat, Select) должны быть оформлены следующим образом:

_”начало”_
…_содержание_…
_”конец”_

”начало” и ”конец” должны не только начинаться с новой строки, но еще и быть единственными инструкциями на ней. Объявления уже не могут быть написаны “в кучу” в одной строке. Например:

Class MyClass Extends BaseClass 'начало объявления класса 
Method Update() 'начало объявления метода
End 'конец объявления метода
End 'конец объявления класса

Несколько инструкции могут находится на одной строке если он разделены знаком “;”. Например:

For Local i:=0 Until 100
Print( i );Print( i*2 );Print( i*3)
Next

Наконец, monkey2 игнорирует любые признаки конца строки, появляющиеся после ‘(‘, ‘[‘ и ‘,’.Это позволяет вам разместить список параметров функции и элементы авто-массива в несколько строк.

Разделение массива

Вместо этого…

Local x:=t[x..] 'только в monkey1!
Local y:=t[..y]
Local z:=t[x..y]

…используйте…

Local x:=t.Slice( x ) 'только в monkey2!
Local y:=t.Slice( 0,y )
Local z:=t.Slice( x,y )

Пока, Марк