Created
March 28, 2011 12:16
-
-
Save maraigue/890360 to your computer and use it in GitHub Desktop.
QBのセリフで書けるプログラム言語を考えてみている。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
# coding: utf-8 | |
# QBのセリフで書けるプログラム言語を考えてみている。 | |
# まだ案のレベルなので、細かい仕様(文法の扱いとか)は詰められていません。 | |
=begin | |
基本的な仕様: | |
* グローバルにアクセス可能なスタックが1つ存在し、 | |
それを用いて必要な変数を格納する。(PostScriptとかと同様) | |
* 現在のところループは書けませんが、再帰で対応可能です。 | |
気が向いたらループ構文も用意するかも。 | |
* 現状は「(◕‿‿◕)」をif文や関数定義の終端として使っていますが、 | |
「(◕‿‿◕)」を廃止して、Pythonのようにインデントを構文要素として | |
採用するかも。 | |
リファレンス(※採用の表記は暫定です): | |
僕: | |
スタックの先頭からアイテムを取り除き、その結果を返す。 | |
(式)と契約して、(関数名)になって欲しいんだ: | |
スタックの先頭に(式)を追加した上で(関数名)の関数を呼び出す。 | |
返り値は、関数の処理が終了した後、スタックの先頭に追加される。 | |
(式)と契約して欲しいんだ: | |
関数の処理を強制的に終了して脱出し、返り値として(式)を返す。 | |
いわゆるreturn文。 | |
【(関数名)】: | |
対応する「(◕‿‿◕)」までを関数定義部とする。 | |
(式)なんて、わけがわからないよ: | |
(式)の結果が真である場合、対応する「こんなの絶対おかしいよ」か | |
「(◕‿‿◕)」までの処理を実行する。 | |
こんなの絶対おかしいよ: | |
else文。 | |
こんなの絶対おかしいよ。(式)なんて、わけがわからないよ: | |
elseif文。 | |
助けて!: | |
スタックの先頭のアイテムを複製する。 | |
魔法少女: | |
引数を標準出力に出力する関数。 | |
君たちの願いごとをなんでもひとつ叶えてあげる: | |
標準入力から文字列を受け取り、それをスタックの先頭に追加する。 | |
=end | |
# 実際のコードはこんな感じになることを想定。 | |
=begin | |
【階乗】 | |
助けて! | |
僕<=1なんて、わけがわからないよ | |
1と契約して欲しいんだ | |
こんなの絶対おかしいよ | |
助けて! | |
僕-1と契約して、階乗になって欲しいんだ | |
僕*僕と契約して欲しいんだ | |
(◕‿‿◕) | |
(◕‿‿◕) | |
君たちの願いごとをなんでもひとつ叶えてあげる | |
僕と契約して、整数になって欲しいんだ | |
僕と契約して、階乗になって欲しいんだ | |
僕と契約して、魔法少女になって欲しいんだ | |
=end | |
# Rubyで書くとこういう意味。 | |
# 標準入力から整数を受け取り、その階乗を計算します。 | |
$stack = [] | |
def factorial(x) | |
$stack.push x # これはコードに書かなくても暗黙のうちに実施されている | |
$stack.push $stack[-1] # スタックの先頭要素を複製 | |
if $stack.pop <= 1: | |
return 1 | |
else | |
$stack.push $stack[-1] # スタックの先頭要素を複製 | |
$stack.push factorial($stack.pop - 1) | |
return $stack.pop * $stack.pop | |
end | |
end | |
$stack.push STDIN.gets | |
$stack.push Integer($stack.pop) # 注:このIntegerはRuby組み込みの関数 | |
$stack.push factorial($stack.pop) | |
puts($stack.pop) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment