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 でジェネレータを作ったり,遅延評価してみる

はじめに#

日本時間の2015年5月16日に Rust 1.0 がリリースされた. というわけで,4月末頃から延々と「書こう書こう」と言っていた記事を,いい加減に書こうと思う.

これまでの流れ#

続きを読む

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

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

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

続きを読む