Skip to content

Instantly share code, notes, and snippets.

@nfunato
Last active July 2, 2022 10:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nfunato/7c90640ac104203fe9457716263143ab to your computer and use it in GitHub Desktop.
Save nfunato/7c90640ac104203fe9457716263143ab to your computer and use it in GitHub Desktop.
お嬢FORTH on top of GFORTH
\ FizzBuzz in OJ-FORTH ( on top of GFORTH )
include oj-forth.fs
\ FORTHには、ほぼ文法が無い(ワードしかない)ということがよく分かると思う
\ なお以下の例で使っているワード 「を」 「まで」 「から」 は、純粋に飾り(NOP)である
わたくし で割り切れるの ( i n -- b ) を
mod 0=
と定義しましてよ
わたくし FizzBuzz ( -- ) を
改行して
100 まで 1 から ドゥーンと
ループ変数が 15 で割り切れるの でしたら 印字なさい" FizzBuzz " を でなければ
ループ変数が 3 で割り切れるの でしたら 印字なさい" Fizz " を でなければ
ループ変数が 5 で割り切れるの でしたら 印字なさい" Buzz " を でなければ
ループ変数を 印字なさい
ですのよ ですのよ ですのよ
を繰り返す
と定義しましてよ
\ $ gforth fizzbuzz.fs
\ Gforth 0.7.3, Copyright (C) 1995-2008 Free Software Foundation, Inc.
\ Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
\ Type `bye' to exit
\ fizzbuzz
\ 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz ok
\ bye
\ $
\ ===================================================================
\ OJ-FORTH (お嬢フォース) on top of GFORTH
\ 注:
\ 上記の fizzbuzz.fs で使われないワードは定義されていないことがありますが、
\ 本質的に必要なパーツ(ワードをコピーする手段) は含まれています
\ -------------------------------------------------------------------
\ Essential definitions
\ - Use Alias for copying words that only have interpreter semantics, e.g.
\
\ ' foo alias bar \ making bar as a non-immediate word
\ ' foo alias baz immediate \ making baz as a immediate word
\
\ where ALIAS is a GFORTH-specific word.
' i alias ループ変数が
' i alias ループ変数を
\ - Use interpret/compile: for copying words that have compilation/immediate semantics
\ - You can use '' instead of ' for words that have compile/immediate semantics,
\ e.g.
\ : '' bl word count find-name dup >r name>int r> name>comp drop ;
: '' ( "name" -- interp-xt compile-xt )
bl word count find-name >r ( r: nt ) \ name-token
r@ name>int ( xt ) \ xt is the exec-token represents interp-semantics
r> name>comp ( xt w xt2 ) \ w,xt2 is the exec-token represents comp-semantics
drop ; ( xt w ) \ here, xt2 is non-essential
'' : interpret/compile: わたくし
'' ; interpret/compile: と定義しましてよ
'' if interpret/compile: でしたら
'' else interpret/compile: ですが
'' else interpret/compile: でなければ
'' then interpret/compile: ですのよ
'' do interpret/compile: ドゥーンと
'' loop interpret/compile: を繰り返す
' . alias 印字なさい
'' ." interpret/compile: 印字なさい"
' cr alias 改行して
\ : noop ; \ gforth has it
\ -------------------------------------------------------------------
\ Auxiliary definitions
\ 助詞には 空定義(noop)を割り当てておくと都合がよくってよ!
: を noop ;
: と noop ;
: まで noop ;
: から noop ;
\ -------------------------------------------------------------------
\ Example
\ : FizzBuzz
\ cr
\ 100 1 do
\ i 15 mod 0= if ." FizzBuzz " else
\ i 3 mod 0= if ." Fizz " else
\ i 5 mod 0= if ." Buzz " else
\ i .
\ then then then
\ loop ;
\ わたくし で割り切れるの ( i n -- b ) を
\ mod 0=
\ と 定義しましてよ
\
\ わたくし FizzBuzz ( -- ) を
\ 改行して
\ 100 まで 1 から ドゥーン と
\ ループ変数が 15 で割り切れるの でしたら 印字なさい" FizzBuzz " ですが
\ ループ変数が 3 で割り切れるの でしたら 印字なさい" Fizz " ですが
\ ループ変数が 5 で割り切れるの でしたら 印字なさい" Buzz " ですが
\ ループ変数を 印字なさい
\ ですのよ ですのよ ですのよ
\ を 繰り返す
\ と 定義しましてよ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment