footmark

ひよっこエンジニアの足跡

【Whitespace】難解プログラミング言語舐めてた

Whitespaceってやつを弄ってみた。

経緯

不意にVimでドット絵を描いてみたくなって、そういうのあるのかなーとググる

絵でプログラミングをする言語「Piet」に遭遇

ソースコードの外見に心を惹かれたのでそのうち弄ってみたい

僕「先輩、難解プログラミング言語ぱねえっす」

先輩「Whitespaceやっとけ」

Whitespaceって?

俗に言う難解プログラミング言語の一つです。
スペース、タブ、改行のみでコードを記述します。

Whitespace


ある程度の命令は実装されているので、Javaなんかの条件分岐や反復のような使い勝手こそないものの、同じようなことはできそうです。
触っていてアセンブリ言語を思い出しました。
そんな感じです。

インストール(?)

本家からダウンロードするのが一番だと思いますが、CPUのタイプが悪いよ!と言われて動かなかったので、Rubyで書かれたインタプリタを使うことにしました。

変態言語whitespaceのインタプリタ書いた - Ryoの開発日記

素数でも見つけるか

まあでも、結局はスペース、タブ、改行の組み合わせを置き換えてるだけだし、読むのは辛いけど、書くのはいけるでしょ!
素数でも見つけるか!


(小一時間後)


難解プログラミング言語舐めてたわ。
言語仕様を把握しきれてないからちょいちょいエラー出るし、そもそもエラーの出た箇所がどこか分からない。
そうです。
見えないんですよ。

下記のURLで松本さんが書いてるように、SとTで書けたらいいのに。。。(Whitespaceじゃなくなるけど)

Rubyist Magazine - Rubyist のための他言語探訪 【第 14 回】 Whitespace

SとTで書くか。。。

というわけでSとTをスペースとタブに置き換えるプログラムを書くことにします。


replacer.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

argv = sys.argv # コマンドライン引数の取得
if len(argv) < 3:
    print('Give input file name and output file name.')
    sys.exit()

in_file = open(argv[1], 'r')
out_file = open(argv[2], 'w')

for i in in_file:
    replaced_s = i.replace('S', ' ')
    replaced_st = replaced_s.replace('T', '\t')
    out_file.write(replaced_st)

in_file.close()
out_file.close()


書けた。

動作確認

松本さんがSとTで書いたHello Worldを丁重にコピペして hello.txt として保存し実行。

$ python replacer.py hello.txt hello.ws


きたァァァ!!!


hello.ws

   	  	   
	
     		  	 	
	
     		 		  
	
     		 		  
	
     		 				
	
     	     
	
     	 	 			
	
     		 				
	
     			  	 
	
     		 		  
	
     		  	  
	
        	 	 
	
  



.ws ファイル実行

$ ruby whitespace.rb hello.ws


結果

Hello World

INTERPRETER: interpretation ended.


できた。
これで勝つる。

置換?可視化?

SとTで書いて置換するのではなく、スペースとタブを可視化した方が早いと思いますが、スペースとタブを可視化できるようなエディタは、改行する際、勝手にインデントを付けてきてWhitespaceには不向きだと思いました。

そういうエディタはオートインデントを無効にすることもできると思いますが、それを言語別設定で書くのも面倒だったので。。。