๐Ÿ’Ž ํฌ๋ฆฌ์Šคํƒˆ ์–ธ์–ด๋กœ ๋œ `eval`! ์• ๋‹ˆ์˜ฌ๋ผ์ดํŠธ๐ŸŸข๐Ÿ”ด ๋Œ€๋ฐ•...

3279 ๋‹จ์–ด rubycrystalmrubyanyolite
Crystal ์–ธ์–ด์—๋Š” 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

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ