オフィスアワーがそろそろ始まるよ!()

お待たせいたしました Zen言語初の LTS 版が誕生

0.8.x シリーズの改善版、v0.8.20200609 をリリースいたしました。

急に暑さが加わってまいりました。 Zen 言語も多数の新機能を携え、よりあつくなって皆様のもとへお届けする準備ができました。

Zen言語初の LTS 版

本リリースは、Zen 0.8 LTS (Long Term Support) の対象となります。 これより2年間、APIはフリーズしたまま、重大なバグフィックスなどのメンテナンスを継続します。 より安心して、Zen言語をご利用いただけます。

LLVM 10 への対応や非同期プリミティブ (async) のドキュメンテーション追加をはじめ、飛躍的な改善を実施しています。

安全性アップ

特に言語仕様では、ポインタ参照先をデフォルトでは変更できない修正を加えています。 この修正により、ポインタ参照先を書き換えたい場合には、mut修飾を追加で記述しなければならなくなりました。 この仕様変更に伴い、既存のコードの移行を簡単にするため zen fmt コマンドに --mut_conv オプションを用意しています。

C言語では歴史的経緯により、ポインタ参照先を書き換えたくない場合にconst修飾を追加します。 本来、無用なポインタ参照先への書き込みを防ぐために、必要な場合以外は全てconst修飾をするべきです。 しかしながら、プログラマはしばしばconst修飾を忘れがちです。 今C言語を再設計するのであればconstがデフォルトになるでしょう。

初心者の方向け機能

初心者の方向けに、コンパイラ・エラーを説明するためのツールも登場しました。

困ったときには、ぜひご利用してみてください。

Zen言語は次の時代を作る新しいプログラミング言語ですので、よりプログラマが正しくプログラムを書ける言語仕様を目指します。

v0.8.20200609 に対するチェンジログ

Zen 言語の漸進についてご紹介しましょう。

エディタの更新

以下のエディタのシンタックスハイライトを更新しました。

LLVM

ドキュメント

ユーザーインタフェース

言語仕様

標準ライブラリ

Deprecated リストは以下の通りです。

Deprecated 代替のもの
build.Version builtin.Version
build.Target Target
build.CrossTarget Target.Cross
builtin.Os Target.Os
builtin.Arch Target.Arch
builtin.Abi Target.Abi
builtin.ObjectFormat Target.ObjectFormat
builtin.SubSystem Target.SubSystem
container.Buffer.ptr 将来削除されます。
container.CustomAllocatorBuffer CustomAllocatorSentinelBuffer(*mut vtable heap.Allocator, u8, 0)
heap.direct_allocator heap.page_allocator
fs.File.access fs.Dir.access(self: Dir, sub_path: []u8, flags: File.OpenFlags) AccessError!void
fs.File.accessC fs.Dir.accessZ(self: Dir, sub_path: [*:0]u8, flags: File.OpenFlags) AccessError!void
fs.File.accessW fs.Dir.accessW(self: Dir, sub_path_w: [*:0]u16, flags: File.OpenFlags) AccessError!void
fs.File.openRead fs.Dir.openFile(self: Dir, sub_path: []u8, flags: File.OpenFlags) File.OpenError!File
fs.File.openReadC fs.Dir.openFileZ(self: Dir, sub_path: [*:0]u8, flags: File.OpenFlags) File.OpenError!File
fs.File.openReadW fs.Dir.openFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.OpenFlags) File.OpenError!File
fs.File.openWrite fs.Dir.createFile(self: Dir, sub_path: []u8, flags: File.CreateFlags) File.OpenError!File
fs.File.openWriteMode fs.Dir.createFile(self: Dir, sub_path: []u8, flags: File.CreateFlags) File.OpenError!File
fs.File.openWriteModeC fs.Dir.createFileZ(self: Dir, sub_path_c: [*:0]u8, flags: File.CreateFlags) File.OpenError!File
fs.File.openWriteModeW fs.Dir.createFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.CreateFlags) File.OpenError!File
fs.File.openWriteNoClobber fs.Dir.createFile(self: Dir, sub_path: []u8, flags: File.CreateFlags) File.OpenError!File
fs.File.openWriteNoClobberC fs.Dir.createFileZ(self: Dir, sub_path_c: [*:0]u8, flags: File.CreateFlags) File.OpenError!File
fs.File.openWriteNoClobberW fs.Dir.createFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.CreateFlags) File.OpenError!File
fs.File.openHandle 将来削除されます。
fs.Dir.open fs.Dir.openDir(self: Dir, sub_path: []u8, args: OpenDirOptions) OpenError!Dir
fs.Dir.openC fs.Dir.openDirZ(self: Dir, sub_path_c: [*:0]u8, args: OpenDirOptions) OpenError!Dir
fs.Dir.openRead fs.Dir.openFile(self: Dir, sub_path: []u8, flags: File.OpenFlags) File.OpenError!File
fs.Dir.openReadC fs.Dir.openFileZ(self: Dir, sub_path: [*:0]u8, flags: File.OpenFlags) File.OpenError!File
fs.Dir.openReadW fs.Dir.openFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.OpenFlags) File.OpenError!File
fs.Dir.openDirC fs.Dir.openDirZ(self: Dir, sub_path_c: [*:0]u8, args: OpenDirOptions) OpenError!Dir
fs.Dir.openFileC fs.Dir.openFileZ(self: Dir, sub_path: [*:0]u8, flags: File.OpenFlags) File.OpenError!File
fs.Dir.openFileWindows fs.Dir.openFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.OpenFlags) File.OpenError!File
fs.deleteDir fs.Dir.deleteDir(self: Dir, sub_path: []u8) DeleteDirError!void
fs.deleteDirC fs.Dir.deleteDirZ(self: Dir, sub_path_c: [*:0]u8) DeleteDirError!void
fs.deleteDirW fs.Dir.deleteDirW(self: Dir, sub_path_w: [*:0]u16) DeleteDirError!void
fs.deleteTree fs.Dir.deleteTree(self: Dir, sub_path: []u8) DeleteTreeError!void
fs.readLink fs.Dir.readLink(self: Dir, sub_path: []u8, buffer: *mut [MAX_PATH_BYTES]u8) ![]mut u8
fs.readLinkC fs.Dir.readLinkZ(self: Dir, sub_path_c: [*:0]u8, buffer: *mut [MAX_PATH_BYTES]u8) ![]mut u8
fs.makePath fs.Dir.makePath(self: Dir, sub_path: []u8) !void
fs.readFileAlloc fs.Dir.readFileAlloc(self: Dir, allocator: heap.Allocator, file_path: []u8, max_bytes: usize) ![]mut u8
fs.readFileAllocAligned fs.Dir.readFileAllocAligned( self: Dir, allocator: heap.Allocator, file_path: []u8, max_bytes: usize, comptime A: u29,) ![]align(A) mut u8
fs.writeFile fs.Dir.writeFile(self: Dir, sub_path: []u8, data: []u8) !void
c.futimes c.futimens(fd: fd_t, times: *[2]timespec) c_int
c.parse 将来削除されます。
os.accessC os.accessZ(path: [*:0]u8, mode: u32) AccessError!void
os.execveC os.execveZ(path: [*:0]u8, child_argv: [*:null]?[*:0]u8, envp: [*:null]?[*:0]u8) ExecveError
os.execvpeC os.execvpeZ(file: [*:0]u8, argv: [*:null]?[*:0]u8, envp: [*:null]?[*:0]u8) ExecveError
os.getenvC os.getenvZ(key: [*:0]u8) ?[]u8
mem.lenWithSentinel mem.len(ptr: anytype) usize
mem.toSlice mem.slice(ptr: anytype) Slice(@TypeOf(ptr))
mem.toSliceConst mem.slice(ptr: anytype) Slice(@TypeOf(ptr))
mem.toSliceWithSentinel mem.slice(ptr: anytype) Slice(@TypeOf(ptr))
mem.toSliceConstWithSentinel mem.slice(ptr: anytype) Slice(@TypeOf(ptr))

Windows

Zen Language Logo

Start your Zen Journey

The world could use a little more Zen.

Start your Zen journey

☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2020 connectFree Corporation. All rights reserved. | 特定商取引法に基づく表示
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.