Вышла новая версия языка программирования Nim 0.15.0.
Данный релиз включает в себя около 180 исправлений ошибок и улучшений. Наиболее значимые изменения: улучшение документации, новый макрос multisync
и новая реализация HttpClient
.
Документация
Все страницы в документации теперь содержат поисковое поле и меню для выбора сортировки процедур. Это позволит искать процедуры, типы, макросы и многое другое на любой странице документации. Сортировка процедур по типу формирует более естественную таблицу содержания, что должно облегчить поиск процедур и других идентификаторов.
Макрос multisync
Был добавлен макрос multisync
для определения процедур синхронного и асинхронного ввода-вывода без лишнего дублирования большого количества кода.
Например, процедура recvTwice
ниже:
proc recvTwice(socket: Socket | AsyncSocket): Future[string] {.multisync.} =
result = ""
result.add(await socket.recv(25))
result.add(await socket.recv(20))
multisync
в следующий код:
proc recvTwice(socket: Socket): string =
result = ""
result.add(socket.recv(25))
result.add(socket.recv(20))
proc recvTwice(socket: AsyncSocket): Future[string] {.async.} =
result = ""
result.add(await socket.recv(25))
result.add(await socket.recv(20))
recvTwice
вместе с синхронными и асинхронными сокетами.HttpClient
Многие процедуры модуля httpclient
объявлены устаревшими в пользу новой реализации с использованием макроса multisync
. Теперь есть два типа: HttpClient
и AsyncHttpClient
. Оба реализуют одинаковые процедуры и функциональность, единственное отличие в поддержке тайм-аута и являются ли они блокирующими или нет.
Список изменений
Изменения, затрагивающие обратную совместимость
- Модуль
json
для JSON-объектов теперь используетOrderedTable
вместоTable
. - Изменения в процедуре
split
из модуляstrutils
. - Поведение в синтаксисе вызова команд в скором времени будет изменен для кругых и фигурных скобок. Код вида
a [i]
будет интерпретирован какa([i])
, вместоa[i]
. Таким образом,f (a, b)
означает, что кортеж(a, b)
был передан вf
. Дляa [i]
компилятор покажет предупреждение:Warning: a [b] will be parsed as command syntax; spacing is deprecated See Issue #3898 for the relevant discussion.
- Перегрузка специальных операторов
.
,.()
,.=
,()
теперь должно сопровождаться прагмой{.experimental.}
. - Шаблоны и макросы
immediate
теперь считаются устаревшими. Вместо этого надо использовать параметрыuntyped
. - Метатип
expr
теперь считается устаревшим. Вместо этого надо использоватьuntyped
. - Метатип
stmt
теперь считается устаревшим. Вместо этого надо использоватьtyped
. - Компилятор стал более разборчив в типах
tuple
. - При компиляции консольных приложений для Windows, кодировка вывода консоли теперь автоматически устанавливается на UTF-8.
- Необработанные исключения в JavaScript выбрасываются, независимо, определен ли
noUnhandledHandler
. При этом, стектрейсы должны стать более удобнее для чтения. - Процедура
system.alert
в JavaScript теперь считается устаревшей. Вместо этого надо использоватьdom.alert
. -
re.nim
более не считается устаревшим, так как очень много кода использует его. Теперь у него упрощенный API. - Тип поля
headers
в типеAsyncHttpClient
был изменен со строковой таблицы на специализированный типHttpHeaders
. - Процедуре
httpclient.request
, принимающейhttpMethod
в качестве строкового значения больше не требуется префикс"http"
(или похожие). - Преобразованные оператором
$
строки значенияHttpMethod
более не содержат префикс"Http"
. - Объект
Request
из модуляasynchttpserver
теперь использует типHttpMethod
для метода запроса.
Добавления в библиотеку
- В модуль
parsecsv
добавленыreadHeaderRow
иrowEntry
в качестве легковесной альтернативы питоновскойcsv.DictReader
. - Добавлена процедура
setStdIoUnbuffered
в модульsystem
для небуферизированного ввода-вывода. - Добавлены
center
иrsplit
в модульstrutils
для предоставления, схожей в Python, функциональности строкам Nim. - Добавлены
isTitle
,title
,swapCase
,isUpper
,toUpper
,isLower
,toLower
,isAlpha
,isSpace
, иcapitalize
в модульunicode.nim
для совместимых с юникодом манипуляций и тестирований регистрам букв. - Добавлен новый модуль
strmisc
для редких строковых операций. В данный момент добавленыpartition
,rpartition
иexpandTabs
. walkFiles
из модуляos
разделен на три отдельные процедуры для четкого разграничения функциональности.walkPattern
умеет работать с файлами и директориями,walkFiles
только с файлами иwalkDirs
только с директориями.- Добавлен синхронный
HttpClient
в модульhttpclient
. Старыеget
,post
и похожие процедуры теперь считаются устаревшими в пользу него. - Добавлен новый макрос
multisync
, позволяющий писать процедуры для синхронных и асинхронных сокетов без дублирования. - Макрос
async
теперь сам автоматически довершает параметрыFutureVar[T]
.
Добавления в инструментарий
- В документации появилась возможность поиска и сортировки по типам.
- Прагмы теперь скрыты в документации по умолчанию.
- В документации теперь присутствуют ссылки на редактирование.
Добавления в компилятор
- Через флаг
-d/--define
теперь можно опционально передавать код, который может быть использован во время компиляции.
Добавления в Nimscript
- В Nimscript появилась возможность включать и отключать определенные подсказки и предупреждения через процедуры
warning
иhint
. - Nimscript экспортирует процедуру
patchFile
, который может использоваться для наложения патчей на модули или файлы для различных пакетов Nimble, включая пакетstdlib
.
Добавления в языке
- Добавлены макросы
{.intdefine.}
и{.strdefine.}
для (опционального) использования определений во время компиляции. - Теперь можно использовать инструкции следующего вида
import system except echo
илиfrom system import nil
.
Исправления ошибок
- Исправлен «Feature request: unbuffered I/O» #2146
- Исправлен «clear() not implemented for CountTableRef» #4325
- Исправлен «Cannot close file opened async» #4334
- Исправлен «Feature Request: IDNA support» #3045
- Исправлен «Async: wrong behavior of boolean operations on futures» #4333
- Исправлен «os.walkFiles yields directories» #4280
- Исправлен «Fix #4392 and progress on #4170» #4393
- Исправлен «Await unable to wait futures from objects fields» #4390
- Исправлен «TMP variable name generation should be more stable» #4364
- Исправлен «nativesockets doesn't compile for Android 4.x (API v19 or older) because of gethostbyaddr» #4376
- Исправлен «no generic parameters allowed for ref» #4395
- Исправлен «split proc in strutils inconsistent for set[char]» #4305
- Исправлен «Problem with sets in devel» #4412
- Исправлен «Compiler crash when using seq[PNimrodNode] in macros» #537
- Исправлен «ospaths should be marked for nimscript use only» #4249
- Исправлен «Repeated deepCopy() on a recursive data structure eventually crashes» #4340
- Исправлен «Analyzing destructor» #4371
- Исправлен «getType does not work anymore on a typedesc» #4462
- Исправлен «Error in rendering empty JSON array» #4399
- Исправлен «Segmentation fault when using async pragma on generic procs» #2377
- Исправлен «Forwarding does not work for generics, | produces an implicit generic» #3055
- Исправлен «Inside a macro, the length of the seq data inside a queue does not increase and crashes» #4422
- Исправлен «compiler sigsegv while processing varargs» #4475
- Исправлен «JS codegen - strings are assigned by reference» #4471
- Исправлен «when statement doesn't verify syntax» #4301
- Исправлен ".this pragma doesn't work with .async procs" #4358
- Исправлен «type foo = range(...) crashes compiler» #4429
- Исправлен «Compiler crash» #2730
- Исправлен «Crash in compiler with static[int]» #3706
- Исправлен «Bad error message „could not resolve“» #3548
- Исправлен «Roof operator on string in template crashes compiler (Error: unhandled exception: sons is not accessible [FieldError])» #3545
- Исправлен «SIGSEGV during compilation with parallel block» #2758
- Исправлен «Codegen error with template and implicit dereference» #4478
- Исправлен «@ in importcpp should work with no-argument functions» #4496
- Исправлен «Regression: findExe raises» #4497
- Исправлен «Linking error - repeated symbols when splitting into modules» #4485
- Исправлен «Error: method is not a base» #4428
- Исправлен «Casting from function returning a tuple fails» #4345
- Исправлен «clang error with default nil parameter» #4328
- Исправлен «internal compiler error: openArrayLoc» #888
- Исправлен «Can't forward declare async procs» #1970
- Исправлен «unittest.check and sequtils.allIt do not work together» #4494
- Исправлен «httpclient package can't make SSL requests over an HTTP proxy» #4520
- Исправлен «False positive warning „declared but not used“ for enums.» #4510
- Исправлен «Explicit conversions not using converters» #4432
- Исправлен «Unclear error message when importing» #4541
- Исправлен «Change console encoding to UTF-8 by default» #4417
- Исправлен «Typedesc ~= Generic notation does not work anymore!» #4534
- Исправлен «unittest broken?» #4555
- Исправлен «Operator „or“ in converter types seems to crash the compiler.» #4537
- Исправлен «nimscript failed to compile/run — Error: cannot 'importc' variable at compile time» #4561
- Исправлен «Regression: identifier expected, but found ...» #4564
- Исправлен «varargs with transformation that takes var argument creates invalid c code» #4545
- Исправлен «Type mismatch when using empty tuple as generic parameter» #4550
- Исправлен «strscans» #4562
- Исправлен «getTypeImpl crashes (SIGSEGV) on variant types» #4526
- Исправлен «Wrong result of sort in VM» #4065
- Исправлен «I can't call the random[T](x: Slice[T]): T» #4353
- Исправлен «invalid C code generated (function + block + empty tuple)» #4505
- Исправлен «performance issue: const Table make a copy at runtime lookup.» #4354
- Исправлен «Compiler issue: libraries without absolute paths cannot be found correctly» #4568
- Исправлен «Cannot use math.`^` with non-int types.» #4574
- Исправлен «C codegen fails when constructing an array using an object constructor.» #4582
- Исправлен «Visual Studio 10 unresolved external symbol _trunc(should we support VS2010?)» #4532
- Исправлен «Cannot pass generic subtypes to proc for generic supertype» #4528
- Исправлен «Lamda-lifting bug leading to crash.» #4551
- Исправлен «First-class iterators declared as inline are compiled at Nim side (no error message) and fail at C» #2094
- Исправлен «VS2010-warning C4090 : 'function' : different 'const' qualifiers» #4590
- Исправлен «Regression: type mismatch with generics» #4589
- Исправлен «„can raise an unlisted exception“ when assigning nil as default value» #4593
- Исправлен «upcoming asyncdispatch.closeSocket is not GC-safe» #4606
- Исправлен «Visual Studio 10.0 compiler errors, 12.0 warning» #4459
- Исправлен «Exception of net.newContext: result.extraInternalIndex == 0 [AssertionError]» #4406
- Исправлен «error: redeclaration of 'result_115076' with no linkage» #3221
- Исправлен «Compiler crashes on conversion from int to float at compile time» #4619
- Исправлен «wrong number of arguments regression in devel» #4600
- Исправлен «importc $ has broken error message (and is not documented)» #4579
- Исправлен «Compiler segfaults on simple importcpp in js mode [regression]» #4632
- Исправлен «Critical reference counting codegen problem» #4653
- Исправлен «tables.nim needs lots of {.noSideEffect.}» #4254
- Исправлен «Capture variable error when using <tt class=„docutils literal“><span class=„pre“>=></span></tt> macro» #4658
- Исправлен «Enum from char: internal error getInt» #3606
- Исправлен «Compiler crashes in debug mode (no error in release mode) with Natural discriminant in object variants» #2865
- Исправлен «SIGSEGV when access field in const object variants» #4253
- Исправлен «varargs cannot be used with template converter.» #4292
- Исправлен «Compiler crashes when borrowing $» #3928
- Исправлен «internal error: genMagicExpr: mArrPut» #4491
- Исправлен «Unhelpful error message on importc namespace collision» #4580
- Исправлен «Problem with openarrays and slices» #4179
- Исправлен «Removing lines from end of file then rebuilding does not rebuild [js only?]» #4656
- Исправлен «getCurrentException and getCurrentExceptionMsg do not work with JS» #4635
- Исправлен «generic proc parameter is not inferred if type parameter has specifier» #4672
- Исправлен «Cannot instantiate generic parameter when it is parent type parameter» #4673
- Исправлен «deepCopy doesn't work with inheritance after last commit» #4693
- Исправлен «Multi-methods don't work when passing ref to a different thread» #4689
- Исправлен «Infinite loop in effect analysis on generics» #4677
- Исправлен «SIGSEGV when compiling NimYAML tests» #4699
- Исправлен «Closing AsyncEvent now also unregisters it on non-Windows platforms» #4694
- Исправлен «Don't update handle in upcoming/asyncdispatch poll() if it was closed» #4697
- Исправлен «generated local variables declared outside block» #4721
- Исправлен «Footer Documentation links, & Community link point to the wrong place under news entries» #4529
- Исправлен «Jester's macro magic leads to incorrect C generation» #4088
- Исправлен «cas bug in atomics.nim» #3279
- Исправлен «nimgrep PEG not capturing the pattern 'A'» #4751
- Исправлен «GC assert triggers when assigning TableRef threadvar» #4640
- Исправлен ".this pragma conflicts with experimental ptr dereferencing when names conflict" #4671
- Исправлен «Generic procs accepting var .importcpp type do not work [regression]» #4625
- Исправлен «C Error on tuple assignment with array» #4626
- Исправлен «module securehash not gcsafe» #4760
- Исправлен «Nimble installation failed on Windows x86.» #4764
- Исправлен «Recent changes to marshal module break old marshalled data» #4779
- Исправлен «tnewasyncudp.nim test loops forever» #4777
- Исправлен «Wrong poll timeout behavior in asyncdispatch» #4262
- Исправлен «Standalone await shouldn't read future» #4170
- Исправлен «Regression: httpclient fails to compile without -d:ssl» #4797
- Исправлен «C Error on declaring array of heritable objects with bitfields» #3567
- Исправлен «Corruption when using Channels and Threads» #4776
- Исправлен «Sometimes Channel tryRecv() erroneously reports no messages available on the first call on Windows» #4746
- Исправлен «Improve error message of functions called without parenthesis» #4813
- Исправлен «Docgen doesn't find doc comments in macro generated procs» #4803
- Исправлен «asynchttpserver may consume unbounded memory reading headers» #3847
- Исправлен «TLS connection to api.clashofclans.com hangs forever.» #4587
>>> Подробности