Вышла новая версия языка программирования 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
>>> Подробности














