Skip to content

Instantly share code, notes, and snippets.

@maraigue
Created March 28, 2011 12:16
Show Gist options
  • Save maraigue/890360 to your computer and use it in GitHub Desktop.
Save maraigue/890360 to your computer and use it in GitHub Desktop.
QBのセリフで書けるプログラム言語を考えてみている。
#!/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