PCASTL色々メモ

大学の課題に、PCASTLでn進数からm進数にするプログラムを書けというお達しが出ました。


馬鹿じゃねーかと思われるでしょうけど、PCASTLはあれなので相当苦労しつつ書いてます。
というかソース読み込んで処理して欲しいので手を加えようと思ったのですがそれすら面倒くさいので直書きして、typoしたら構文木にアタッチしてすぐ書き換えです楽チンですね!!


いくつかメモ、現在進行系で書いているので。

まずは10進数からn進数にしてみる。

取りあえずforループ回すか再帰で書くかのどっちかがあるけどせっかくなので再帰で書くとして、感覚としては

func(10_num,n)
  if(10_num==0)return;  
  func(10_num/n,n);
  list.push(10_num%=n)

なんでこのlist相当のものを実装するかっていうと、えーと完全に気分です。

書いてて気づいたけど、この言語にはmodが無い。

modもまともに書けない

mod = function(a,b)
{
  if(a<b)return(a)
  else return(mod(a-b,b))
}

これだと多分不味いです。else-statementのreturnの引数のmodが評価されずに返ってきます。
ので

mod = function(a,b)
{
  if(a<b)return(a)
  else{tmp=mod(a-b,b) return(tmp)}
}

です。しかしながらtmp変数とか使って再帰やるのは相当に嫌なので

mod = function(a,b)
{
  c = a
  for(`{}';c>=b;c=c-b){}
  return(c)
}

で、これは相当遅いわけで、どうやって高速化したもんかと悩み中。

切捨て割り算実装

div = funtion(a,b)
{
  tmp = mod(a,b)
  return((a-tmp)/b)
}

oct2hex

conv = function(num)
{
  if(num==10)return("a")
  if(num==11)return("b")
  if(num==12)return("c")
  if(num==13)return("d")
  if(num==14)return("e")
  if(num==15)return("f")
  return(ntoa(num))
}

oct2hex = function(num)
{
  if(num==0)return()
  oct2hex(div(num,16))
  print(conv(mod(num,16)))
}

oct2hex(42)
=>"2."
  "a"

oct2hex(774)
=>"3."
  "0."
  "6."

まぁ こんな所か・・・。