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