blog.ryota-ka.me

Nix Expression Languageで遅延リストを作ってみる

この記事はCAMPHOR- Advent Calendar 2018 15日目の記事です.14日目の記事は@Rtm6Lgoとある研究室の運営のエモいお話でした.

Nix Expression Languageを用いて遅延リストを作る.普段は「ジェネレータを作ったり、遅延評価してみる」だが,Nix Expression Languageは基本的に純粋なので,mutableなstateをもつイテレータや,それを生成するジェネレータという概念はなじまない.

続きを読む

Swift 3でジェネレータを作ったり、遅延評価してみる

Swiftでのジェネレータの取扱いや遅延評価については,ymyzk先生の『Swift でジェネレータを作ったり、遅延評価してみる』において解説されているが,2015年5月の情報といささか古く,Swiftのヴァージョンも1.2だった頃の記事なので,改めて書くことにした.

2017年7月16日現在,Xcode 9.0 beta上ではSwift 4.0がサポートされているが,手元の環境はXcode 8.3.3であるため,Swift 3.1をベースに解説する.Appleの先走りで,ドキュメントのリンク先が一部Swift 4に関するものになっている部分があるが,本記事の理解にあたって本質的な違いはないはずである.

続きを読む

Vim scriptでジェネレータを作ったり、遅延評価してみる

この記事はCAMPHOR- Advent Calendar 2016 8日目の記事です.

はじめに#

日本時間の2016年9月12日に,Vim 8.0がリリースされた.Vim 7.4のリリースからはおよそ3年振り,Vim 7.0からは実におよそ10年振りのヴァージョンアップだそうだ.Vim 8.0では様々な新機能が追加されたが,中でもVim scriptにラムダ式*1が追加されたのには目を引くものがあった.

ラムダ式の登場により,標準のmap()関数やfilter()関数の使い勝手が大幅に改善されたが,これらで遊んでいるうちに,似た操作をリストだけではなくイテレータに対して適用したいという欲求が自然と生じてきた.しかしながら,Vim scriptにはリストはあれど,イテレータなどというものは存在するはずもないので,今回自前で実装する運びとなった.

本稿では,まず初めに,ECMAScript 2015のインタフェースに似た*2,すなわち,nextを呼ぶと{ value: 42, done: false }という形式に近い値が返ってくるイテレータをVim scriptで実装する.次に,このイテレータを返す関数,すなわちジェネレータを定義する.その後,イテレータを拡張し,mapfilterなどのよく知られたメソッドを定義することで,種々の操作を簡便に行えるようにする.

これまでの流れ#

続きを読む

Perl 6でジェネレータを作ったり、遅延評価してみる

この記事はCAMPHOR- Advent Calendar 2015 30日目の記事です.

はじめに#

今月2015年12月は,12月3日のPHP 7のリリースに始まり,クリスマスにはRuby 2.3並びにPerl 6のリリースが相次いだため,往年のスクリプト言語たちにとっては華々しいひと月となった.調べてみたところ,PHP 5.0.0のリリースは2004年1月,Perl 5.000のリリースは1994年10月だったそうなので,やはり大型のリリースが相次いだのだなという気分になる.

というわけでこの際なので,最近ではもはやCAMPHOR-の伝統芸能となりつつある,「ジェネレーターを作ったり、遅延評価してみる」シリーズをPerl 6で書いてみることにした.ちなみに筆者のPerl歴は1日である.

続きを読む

Rustでジェネレータを作ったり,遅延評価してみる

続きを読む

RubyのEnumeratorでジェネレータを作ったり,遅延評価してみる

RubyにはEnumerableモジュールってのがあって,これをincludeしたオブジェクトは,自身に対して何かしらの反復処理ができるようになる*1.また,その反復処理を用いたEnumerable#mapとかEnumerable#select*2とかEnumerable#reduceとかが使えるようになる.

更に,Enumeratorというものがある.Enumerableがモジュールなのに対して,Enumeratorはクラスなので,インスタンス化できる.また,EnumeratorEnumerableをincludeしている.このEnumeratorは,外部イテレータ,いわゆるジェネレータとして使える.

続きを読む