Cobra: различия между версиями

Содержимое удалено Содержимое добавлено
м →‎Ключевые слова: clean up с помощью AWB
м <source> -> <syntaxhighlight> (phab:T237267)
 
Строка 6:
Пример текста программы обозначается следующим образом:
<font face="verdana">
<sourcesyntaxhighlight lang="python">
"""
This is the infamous "Hello, world." example.
Строка 19:
def main
print 'Hello, world.'
</syntaxhighlight>
</source>
 
== [[w:Программа Hello world|Hello World!]] ==
Строка 25:
1. Создаем файл [[Cobra/Hello.cobra|Hello.cobra]] [[Работа с электронным текстом|в любом текстовом редакторе]], пишем:
<font face="verdana">
<sourcesyntaxhighlight lang="python">
class Hello
 
def main
print 'Hello, world!'
</sourcesyntaxhighlight></font>
 
2. Скомпилируем программу и получим:
Строка 50:
Открыв полученную сборку в ildasm.exe, можно посмотреть что метод main был преобразован в следующие инструкции:
<font face="verdana">
<sourcesyntaxhighlight lang="cil">
.method public hidebysig newslot virtual instance void Main() cil managed
{
Строка 80:
IL_0023: ret
} // end of method HelloWorld::Main
</sourcesyntaxhighlight></font>
CIL-инструкции перед исполнением компилируются на лету с оптимизацией для конкретной платформы. За компиляцию CIL-инструкций отвечает JIT(just-in-time)-компилятор.<br />
Рассмотрим метаданные, которые были сгенерированы для метода main:
<font face="verdana">
<sourcesyntaxhighlight lang="cil">
Method #1 (06000001)
-------------------------------------------------------
Строка 95:
ReturnType: Void
No arguments.
</sourcesyntaxhighlight></font>
Метаданные описывают тип(например, класс) и всех его членов(например, методов). Заметим, что метод '''main''' не имеет аргументов.<br />
Также немаловажным является наличие в сборке манифеста, в которой указаны все внешние сборки требуемые текущей сборке, их версии и т.д. Ниже приведен пример наиболее существенной части манифеста:
<font face="verdana">
<sourcesyntaxhighlight lang="cil">
.assembly extern /*23000001*/ mscorlib
{
Строка 117:
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
</sourcesyntaxhighlight></font>
 
== Типы данных ==
Строка 190:
=== Синтаксис ===
<font face="verdana">
<sourcesyntaxhighlight lang="python">
use NAMESPACE_NAME
 
Строка 239:
@COMPILER_DIRECTIVE_ID {DIRECTIVE_ARGS}
%%COMPILER_DIRECTIVE_ID {DIRECTIVE_ARGS}
</sourcesyntaxhighlight></font>
 
=== Платформа ===
Строка 247:
Пример программы [[Cobra/Hops.cobra|Hops.cobra]] показывает применение некоторых языковых конструкций.
<font face="verdana">
<sourcesyntaxhighlight lang="python">
#Assembly attributes
assembly has SharedAttribute
Строка 297:
body
return String.format(this, args) to !
</sourcesyntaxhighlight></font>
==== Класса простого HTTP-сервера ====
Пример класса HTTP-сервера [[Cobra/MyHttpServer.cobra|MyHttpServer.cobra]] реализующего обработку самых основных возможностей протокола HTTP/1.
Строка 315:
Комментарии в Cobra могут обозначаться предваряющим их символом # и продолжаются до конца строки:
<font face="verdana">
<sourcesyntaxhighlight lang="python">
# ANY COMMENT TEXT
code... # TRAILING COMMENT TEXT
</sourcesyntaxhighlight></font>
Можно использовать тройные кавычки как в Python
<font face="verdana">
<sourcesyntaxhighlight lang="python">
"""This is a single line docstring."""
 
Строка 330:
Leading and trailing triple-" delimiter each on its own line.
"""
</sourcesyntaxhighlight></font>
Для многострочных комментариев так же существует конструкция /#... #/:
<font face="verdana">
<sourcesyntaxhighlight lang="python">
/#
print '**********************************************'
Строка 339:
print '**********************************************'
#/
</sourcesyntaxhighlight></font>
В документации, указано о возможности использовать данный комментарий внутри выражений. Однако в версии 9.3 это не выполнялось. Конец комментария в соответствии с регулярным выражением COMMENT_BLOCK_STOP класса CobraTokenizer соответствует '''[^#]*\#\/.*$'''. Пример взятый из документации не будет работать:
<font face="verdana">
<sourcesyntaxhighlight lang="python">
x = /# -1 * #/ z * y
# same as x = z * y
 
params = .paramDecls(/#skipParen=#/true)
</sourcesyntaxhighlight></font>
 
== Создание классов ==
Строка 356:
Для создания классов предусмотрена инструкция '''class'''.
<font face="verdana">
<sourcesyntaxhighlight lang="python">
class ИмяКласса
</sourcesyntaxhighlight></font>
 
== Создание методов ==
Методы создаются как и обычные функции. Методы начинаются со служебного слова '''def'''.
<font face="verdana">
<sourcesyntaxhighlight lang="python">
def main
</sourcesyntaxhighlight></font>
 
== Операции ==
Строка 406:
Пример пустого списка: []
<font face="verdana">
<sourcesyntaxhighlight lang="python">
names = [ 'mike', 'gary', 'pat', 'bruce', 'paul'] # List<of String>
heads = [3,1,1,1,1] # List<of int>
Строка 413:
myList=[]
myList.add('1th')
</sourcesyntaxhighlight></font>
 
=== Словарь ===
Строка 420:
Пример пустого словаря {:}.
<font face="verdana">
<sourcesyntaxhighlight lang="python">
nameId = { 'mike':10110, 'gary':21003, 'paul':32289 } # Dictionary<of String, int>
assert nameId['mike'] == 10110
Строка 428:
mmap = {:}
mmap['top'] = 99
</sourcesyntaxhighlight></font>
 
=== Набор ===
Строка 435:
Пустое набор {}.
<font face="verdana">
<sourcesyntaxhighlight lang="python">
names= {'gary', 'mike', 'bruce', 'paul'}
assert names.intersection({'gary', 'paul'} == {'gary', 'paul'}
Строка 442:
collisions={}
collisions.add(toyota)
</sourcesyntaxhighlight></font>
 
=== Массив ===
Строка 449:
Пустой массив @[]
<font face="verdana">
<sourcesyntaxhighlight lang="python">
names = @[ 'mike', 'gary', 'pat', 'bruce', 'paul'] # String[] or Array<of String>
heads = @[3,1,1,1,1] # int[] or Array <of int>
heads[4] = 3
</sourcesyntaxhighlight></font>
Списки, проще в использовании и более гибки, но для некоторых целей массивы имеют более высокую производительность.
 
Строка 470:
* для float 32, 64
<font face="verdana">
<sourcesyntaxhighlight lang="python">
d = 123 # default (Decimal)
d = 123.4d
Строка 486:
f1 = 97.3f32 # or
f1 = 97.3_f32
</sourcesyntaxhighlight></font>
 
== Ключевые слова ==