LINUX.ORG.RU

Nim 0.15.0

 


1

5

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

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: sudopacman (всего исправлений: 2)

Ответ на: комментарий от menangen

swift и d
посоветовать всем, кто хочет начать кодить
простота

Смотрю ты начинающим хочешь сразу отбить желание?

AUX ★★★
()
Ответ на: комментарий от FilosofeM

Раст пошел по тому же пути. Уродство синтаксиса - это девиз раста.

AUX ★★★
()

Как и у каждого языка, всегда будет существовать целая толпа неосиляторов. И есть подозрение, что рассадник оных уже начинает пускать свои корешки в этом треде. Зато когда вышел mono и появилась возможность писать на языке Microsoft'а под Linux все очень радовались, ага.

Martein
()
Ответ на: комментарий от anonymous

В том, что нельзя расставить отступы автоматом.

anonymous
()
Ответ на: комментарий от anonymous

Рантайм у него тоже заведётся везде где есть Си? Если уж так теоретизировать — раст куда легче запустить на любой платформе для который есть бэкэнд к LLVM.

anonymous
()
Ответ на: комментарий от anonymous

Ассоциации с паскалем как раз вызывает ним е его type record, var, with и прочим.

anonymous
()
Ответ на: комментарий от buddhist

Отключаемый как в D? На бумаге отключил, а по факту остался без половины языка и стандартной библиотеки?

Кстати, кто нибудь знает или нет: в DMD уже исправили дибильное ограничение на 32к ф-й?

anonymous
()
Ответ на: комментарий от menangen

Из компилируемых самый простой golang, проще не найти.

AUX ★★★
()
Ответ на: комментарий от shkolnick-kun

Непонятно что именно про си бэкэнд ты хочешь услышать. С отключением GC как и в остальных — никак.

anonymous
()
Ответ на: комментарий от anonymous

Сказал фанбой того, что закопают вместе с мозиллой.

Если кого и закопают, то это тупого анонимуса. Т.е. тебя.

FilosofeM ★★
()
Ответ на: комментарий от anonymous

Я имею в виду возможность генерировать код на Си, а не бинарь.

Если ГЦ не выключается, то нинужно.

anonymous
()
Ответ на: комментарий от anonymous

Если кто-то не поленится написать бэкэнд к LLVM который будет генерировать код на си (лол) то появится, а так как ты понял нету.

Алсо, по такой логике из новых языков нужен только ненавистный тебе раст.

anonymous
()
Ответ на: комментарий от anonymous

Лучший из языков, который юзает LLVM на всю катушку - это swift. Сишка + c++ уже не нужна в прикладной сфере, при наличии swift и go. Только на винде, может, ленивые челы будут писать на любимом всеми корпоративщиками C# да Java у банках.

menangen ★★★★★
()
Последнее исправление: menangen (всего исправлений: 1)
Ответ на: комментарий от anonymous

Генерировать код на C++ умеет, вроде, только Haxe.

menangen ★★★★★
()
Ответ на: комментарий от menangen

Лучший из языков, который юзает LLVM на всю катушку - это swift.

А как же Rust?

dotcoder ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Rust не может в архитектуры, ограничивает свободу, многословен, поэтому не нужен.

Nim может в архитектуры, он не ограничивает свободу программиста. Nim нужен, до тех пор, пока там есть генерация Си.

anonymous
()

Когда там концепты доделают?

Почему за последние пару месяцев багов нашли больше, чем исправили?

Когда там 1.0.0?

anonymous
()
Ответ на: комментарий от anonymous

Опачки! Команда ЙУЛИ запилила свой форк lock-c-backend, с блэкджеком и шлюхами, ну все, теперь заживем!

Когда баги пофиксят.

anonymous
()
Ответ на: комментарий от menangen

Мне вот кристал не понравился тем, что необходимо завершать инструкции if, while, case словом end. Легко запутаться, если есть вложенность и форматировать код не обязательно.

dicos ★★
()
Ответ на: комментарий от menangen

который юзает LLVM на всю катушку

Что такого делает Swift, чего не делает любой другой ЯП генерирующий IR?

при наличии swift и go

Go такая замена плюсам, что я даже не знаю.

И когда там Swift выйдет под винду? Никогда? А-ха-ха.

RazrFalcon ★★★★★
()
Ответ на: комментарий от menangen

Тоже считаю, что годных компилируемых язычка два: swift и d. Которые можно посоветовать всем, кто хочет начать кодить на компилируемых в машинный код языках, либо кому нужна производительность, но простота.

А как же Go?

Xintrea ★★★★★
()
Ответ на: комментарий от shkolnick-kun

Я бы спросил нахрена его туда тащить, но лучше отпишу о том что не запустится: будь добр хотя бы рантайм портировать.

anonymous
()
Ответ на: комментарий от shkolnick-kun

Про то, что он не работает без ОС и не будет работать с костылями вместо ядра на мк ты не думал? а раст заработал бы, гы

anonymous
()
Ответ на: комментарий от anonymous

Там проблема больше в переносимостьи.

Ну не заморачивались ребята с запуском этого не на x86/ARM

shkolnick-kun ★★★★★
()
Последнее исправление: shkolnick-kun (всего исправлений: 1)
Ответ на: комментарий от tp_for_my_bunghole

Это лучше чем то что было под названием «алгоритмический язык» когда-то давно в начальной школе совка в конце 80-х. Были только учебники, кампутеров не было.

Это у тебя не было. А у меня были и компутеры, и учебники. До сих пор вспоминаю «если то иначе всё».

anonymous
()
Ответ на: комментарий от Esper

Легко запутаться, если есть вложенность

Шта?

Вот «готовый» псевдокод, который работает на сервере, ни кто его не форматировал:

if ....
for ....
if ...
......
end
if ...
......
for ....
end
end
end
end
На сервере из редакторов только nano. Допустить ошибку во время правки очень легко.

Форматировать код руками нинужно.

Если нет четкого обязательного стандарта, то каждый форматирует как ему хочется. Кто без пробелов, кто с 2 пробелами, кто с 4-мя, кто табами форматирует.

dicos ★★
()
Ответ на: комментарий от dicos

Вот «готовый» псевдокод, который работает на сервере, ни кто его не форматировал

Не знаю, в какой запенде ты такое нашёл. Я в последний раз видел неформатированный код, когда в студенческие годы правил одногруппнице лабу за шоколадку.

Если нет четкого обязательного стандарта, то каждый форматирует как ему хочется.

И что? Если нет обязательного стандарта, от этого не спасёт ни один язык.

Esper
()
Ответ на: комментарий от dicos

Займись лучше делом и прекрати придумывать всякие «проблемы» там, где их нет

anonymous
()
Ответ на: комментарий от anonymous

А что касательно сложности, то он гораздо проще чем С++.

Проблема именно в том, что ты сравниваешь с С++, с языком весьма сложным и содержащим немало граблей. Я и сам такой, если что. Вот только у людей не имеющих опыта с С++ впечатление может быть совсем другим.

DarkEld3r ★★★★★
()
Ответ на: комментарий от anonymous

Алсо, по такой логике из новых языков нужен только ненавистный тебе раст.

Дык, в Nim ГЦ отключить можно.

DarkEld3r ★★★★★
()
Ответ на: комментарий от dicos

Легко запутаться, если есть вложенность и форматировать код не обязательно.

Со скобками разве не точно так же?

DarkEld3r ★★★★★
()
Ответ на: комментарий от shprotua

Если будешь освобождать - не потечет, ну и статик и авто в каком-то виде там есть.

shkolnick-kun ★★★★★
()
Ответ на: комментарий от shprotua

Пиши на сишке с крестами, я же не запрещаю

buddhist ★★★★★
()
Ответ на: комментарий от Esper

Вот «готовый» псевдокод, который работает на сервере, ни кто его не форматировал

Не знаю, в какой запенде ты такое нашёл. Я в последний раз видел неформатированный код, когда в студенческие годы правил одногруппнице лабу за шоколадку.

В работающем php проекте. Когда-то один выложил этот код на сайт без форматирования. Другой этот код вставил в проект, не форматируя. И тут на сервере пошло что-то не так. Разбирался. Да, там были фигурные скобки, но от этого легче не было.

Если нет четкого обязательного стандарта, то каждый форматирует как ему хочется.

И что? Если нет обязательного стандарта, от этого не спасёт ни один язык.

Это не есть хорошо. Хорошо единообразие.

dicos ★★
()
Ответ на: комментарий от dicos

В работающем php проекте.

Ну ладно, признаю, от intendation-based syntax может быть такого рода польза. Только вот от массовых расстрелов увольнений польза в вашем случае была бы больше.

Хорошо единообразие.

Я тебе говорю, что Питон сам по себе не приносит единообразия, а ты отвечаешь фразами в духе капитана Очевидность. Прекрасная аргументация.

Esper
()
Ответ на: комментарий от anonymous

Для питона нельзя написать автоматический форматтер кода, который не ломался бы при первом же копипасте блока в другое место с неправильным отступом. Поэтому скобочки - это маст хэв.

Если копируешь не в блокноте, то отступы выправляются автоматически (относительно текущего отступа). А если брать всевозможные текстовые редакторы и платформы, то и перенос строки нельзя за разделитель брать. Так как при открытии в ОС с разделителем, содержащим \r файла, где разделитель \n можно получить пол-программы комментарием.

Для питона нельзя написать автоматический форматтер кода

Так он не нужен. В любой программе на питоне все отступы уже расставлены. Форматтер нужен только если язык позволяет всё писать без отступов или в одну строку. Тогда без него сложно.

monk ★★★★★
()
Ответ на: комментарий от buddhist

В нем отключаемый GC

И дальше что? Отключил GC и получил такой-же небезопасный язык, как С и ему подобные.

FilosofeM ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.