Skip to content

Instantly share code, notes, and snippets.

@youz
Last active October 13, 2022 16:30
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save youz/73e7d5c8c570cfa7df25fef267e5c43a to your computer and use it in GitHub Desktop.
Save youz/73e7d5c8c570cfa7df25fef267e5c43a to your computer and use it in GitHub Desktop.
quine.grass
@echo off
call grasspile quine-base.ml -P 1000000 >quine-base.grass
if ERRORLEVEL 1 (
echo compile failed [exitcode=%ERRORLEVEL%]
exit /b 1
)
ruby mkquine.rb >quine.grass
grass quine.grass >quine2.grass
if ERRORLEVEL 1 (
echo execution failed [exitcode=%ERRORLEVEL%]
exit /b 1
)
fc quine.grass quine2.grass
dir quine*.grass
src = File.open("quine-base.grass").read.chomp.sub(/^w[Ww]+v/, '')
enc = src.gsub(/./){|m|
case m
when 'w'
'Ww'
when 'W'
'Www'
when 'v'
'Wwww'
end
}
print("w#{enc}v#{src}")
(*
# require grasspiler (https://www.npmjs.com/package/@susisu/grasspiler)
grasspile quine-base.ml -o quine-base.grass
ruby mkquine.rb > quine.grass
*)
let data x = Out Out (* placeholder for encoded source *)
(* church-num *)
let cn2 f x = f (f x)
let s32 c =
let s16 = cn2 cn2 cn2 Succ in
s16 (s16 c)
(* w,W,v *)
let decw sn =
let cn4 = cn2 cn2 in
let cn256 = cn4 cn4 in
let f c =
let s = sn c in
s w c s
in
cn256 f w
let W = decw s32
let id x = x
let Succ = id Succ
let v = decw Succ
let w = Succ v (* ! *)
(* print *)
let o = id Out
let oo x = o (o x)
let outenc c =
let t = (o W) c o oo in
let w = o w in
let isw = w c in
isw isw t w
let false x y = y
let printcode e0 =
let acc = data e0 false in
let id = false acc in
let o = id o in
let w = o w in
let lst = acc (w w) in
let _ = lst outenc in
let _ = o v in
lst o
let tochar i j = (i j) w (i (Succ j) W v)
let fcons car cdr f =
let _ = cdr f in
f car
let cons x y b = b x (Succ y)
let false x y = y
let gennext e j acc =
let i = acc false in
let lst = acc (i i) in
let chr = tochar i j in
e (cons (fcons chr lst) i)
let encode self acc f = (* f | <encode> | false (\xy.y) *)
let recur = self self in
let a = f false in (* | acc of f | \y.y = id *)
let i = a false in (* | idx of f | false *)
let nextf = gennext recur i in
let b = i i in (* | true | id *)
let c = b b in (* | \x.true | id *)
let d = c false in (* | true | false *)
let x = d nextf c in (* | nextf | id *)
x acc (* | next | acc *)
let result = printcode (encode encode (cons false w))
(* ok
let test1 _ =
let _ = Out w in
let _ = Out W in
Out v
-> wWv
*)
(* ok
let test2 _ =
let _ = outenc w in
let _ = outenc W in
outenc v
-> WwWwwWwww
*)
(* ok
let test3 _ =
let lst = fcons w (fcons W (fcons v false)) in
let _ = lst Out in
lst outenc
-> vWwWwwwWwwWw
*)
(* ok
let id x = x
let Succ = id Succ
let w = id w
let test5 _ =
let t c = Out (tochar c w) in
let _ = t w in
let _ = t (Succ w) in
let _ = t (Succ (Succ w)) in
t (Succ (Succ (Succ w)))
-> wWvv
*)
wWwWwWwwWwwWwWwwWwWwWwWwWwWwWwWwwWwWwWwWwwWwWwWwWwwwWwWwWwwWwwWwWwwWwwWwwWwWwwwWwWwwWwwWwWwWwwWwWwWwWwwWwWwWwWwWwWwWwWwWwwWwWwWwWwWwwWwwWwWwwwWwWwwWwwWwwWwwWwWwwWwwWwwWwwWwWwWwWwWwwWwWwwWwWwWwWwwWwWwWwWwWwWwWwWwWwWwWwWwWwwwWwwWwWwWwwwWwWwwwWwwWwWwWwWwWwWwWwWwWwWwwWwwWwwWwwWwWwwWwwWwWwwwWwWwWwwWwwWwWwwWwWwWwWwWwwWwwWwwWwwWwwWwwWwwWwWwWwWwwWwwWwwWwwWwwWwWwwWwWwWwWwWwWwWwWwWwWwWwWwwWwWwWwWwWwWwWwWwWwWwwWwwWwwWwwWwwWwWwwwWwwWwwWwwWwwWwwWwWwWwWwWwWwWwWwWwWwWwWwWwwwWwWwwWwwWwWwwWwwWwwWwWwwwWwWwwWwwWwwWwWwWwWwWwWwWwWwWwWwwWwWwWwwWwWwWwWwWwWwwWwWwWwWwWwWwwWwwWwwWwwWwwWwwWwwWwWwWwWwWwWwWwWwWwWwwWwWwWwWwWwWwWwwWwWwwWwWwWwWwWwwWwWwWwWwWwwwWwWwWwwwWwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwWwwWwWwWwWwwWwwWwwWwwWwWwwWwWwWwWwWwWwWwWwWwwWwWwWwWwWwWwWwWwWwWwWwWwwWwWwwWwwWwwWwwWwwWwWwwWwWwWwWwWwWwWwWwWwWwWwwWwwWwwWwwWwwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwwWwwWwwWwWwWwWwWwWwWwwwWwWwWwWwwWwWwWwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwWwWwWwwWwwWwWwwwWwWwWwWwwWwwWwWwwWwwWwWwWwWwWwwwWwWwWwwwWwWwWwWwwWwWwWwWwWwwWwWwwWwwWwwWwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwWwWwWwwWwWwWwWwWwWwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwWwwWwWwWwWwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwWwwWwWwWwWwWwWwWwWwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwWwwwWwWwWwWwwWwwWwwWwWwWwWwwWwwWwWwWwWwWwWwWwwWwWwWwWwWwWwWwWwwWwwWwwWwwWwwWwwWwwWwWwWwWwwWwWwWwwWwwWwwWwWwWwWwwWwWwwWwWwWwWwWwWwWwWwWwWwWwWwWwwWwWwWwWwWwwWwWwWwWwwWwWwWwWwWwWwWwWwWwWwWwWwWwwwWwwWwWwwWwwWwwWwwWwwWwwWwWwWwWwWwwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwwWwwWwwWwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwwWwvwwWWwWwwwwwwwWwwwWwwwvwwWWwWWWwvwWWwwWwwwWwwwwwwwwWwwwwWWwvwWWWWwWWWWwwwwWwWwwwWwwwwwwwwwwwwvWwwvwvWwwwwwwwwwWWWWwWWwvwwWWwWwwwwWWWWWWWwwwWWWWWwWwwwwwwwwwwwWwwwwwwwwwWWWWWwvWWWWWwwwwwwwwwwwwvwWWwWWWwvwWWWwwwwwwwwwWwwWwwwwwWwwwwwWWWWWWWwwwwwwwwwWwwwwwwWwWwwwwWwwwwvwwvwWWWWWWWWWWWWWWWWwWwwwWWWWwWwwwwwwwwWwwwwwwwwwwwWwWWWWWwWwwwwwwwwwwWWWWWwwwwwwwwwwwwwwwwWWWwwwwwwvwwwWwwwWWWWWWWWWWWWWwwwWWwvwwwWWwWWwwwwvwwvwwwWwwwwWwWWWwWWWWWWWWWWWWWWWwwwWwwwwwwWWWWWWWWWWwWwwwwWWWWWWWWWWWWWwWwwwwwwwwWWWWWWWWWWWWwvwwwWWWwwwWWwwwwwwWwwwwwwwWWWWWWWwwwWwwWWWwwwWwWwwwwwwwwwwwwWwwwwWwwwWwwwwwwwwwwwwvWwWWWWWWwwwwWwwwwwwwwwwwwwwWWWwWWWWWWWWWWw
@echo off
call grasspile quine-base.ml -o test.grass
if ERRORLEVEL 1 (
exit /b 1
)
grass -d test.grass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment