๐ ํฌ๋ฆฌ์คํ ์ธ์ด๋ก ๋ `eval`! ์ ๋์ฌ๋ผ์ดํธ๐ข๐ด ๋๋ฐ...
eval
๊ฐ ์์ต๋๋ค.Crystal ์ธ์ด์์ eval์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ Crystal ์์ฒด๋ฅผ ์คํ ํ์ผ์ ํฌํจํด์ผ ํฉ๋๋ค.
Eval์ ์ข ์ข Ruby ์ธ์ด์์ ๋์ ์ต๊ด์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ํ์ง๋ง ๊ฐ๋์ Crystal ์ธ์ด์์ eval์ ์ฌ์ฉํ๊ณ ์ถ์ ๋๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค Crystal ์คํ ํ์ผ์ mruby(๋๋ CRuby)๋ฅผ ํฌํจ์์ผ Crystal ์ธ์ด์์๋ eval์ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฉ์ง ํ๋ก์ ํธ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ ๋์ฌ๋ผ์ดํธ
https://github.com/Anyolite/anyolite
์๋๋ผ์ดํธ๋ผ๊ณ ๋ค์ด๋ณด์ จ๋์? ํฌ๋ฆฌ์คํ์ ๋ฐํ ๋ฃจ๋น์ ๋๋ค. ์ด ๋์๊ด์ ๋ฑ ๋ง๋ ์ด๋ฆ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์๋
shards.yml
dependencies:
anyolite:
github: Anyolite/anyolite
shards install์ ์คํํ๋ฉด Anyolite๊ฐ ์๋์ผ๋ก mruby๋ฅผ ์ค๋นํฉ๋๋ค.
kitty.cr
require "anyolite"
code = ARGV[0]
class Kitty
def initialize(@n : Int32)
end
def mew
puts "mew " * @n
end
end
Anyolite::RbInterpreter.create do |rb|
Anyolite.wrap(rb, Kitty)
Anyolite.eval(code)
p Anyolite.cast_to_crystal(rv, Int32)
end
์ง๋ค:
crystal build kitty.cr
์ด์:
./kitty "Kitty.new(n: 3).mew; 6"
์ฐ์ถ:
mew mew mew
6
๋ฐํ์์ Ruby ์ฝ๋๊ฐ ํ๊ฐ๋๊ณ ์์์ ์ ์ ์์ต๋๋ค. ๋ง์นจ๋ด Crystal ์ธ์ด๋ก eval์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค!
์์ฑ๋ ์คํ ํ์ผ์ ํฌ๊ธฐ๋ ์ฝ 7Mb๋ก mruby ํตํฉ์ผ๋ก ์ธํด ๋ค์ ํฝ๋๋ค. ๊ทธ๋ฌ๋ Crystal๋ก ํ๊ฐ๋ฅผ ์คํํ๋ ๊ฒ์ ํฅ๋ฏธ๋กญ๊ณ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ฐธ์กฐ
https://anyolite.github.io/anyolite/Anyolite.html
https://github.com/Anyolite/anyolite/wiki
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ํฌ๋ฆฌ์คํ ์ธ์ด๋ก ๋ `eval`! ์ ๋์ฌ๋ผ์ดํธ๐ข๐ด ๋๋ฐ...), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/kojix2/eval-in-crystal-language-anyolite-is-amazing-42niํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค