2010/12/14

Gauche スクリプトに S 式を渡したい時って

例えばこういうことをしたい時って、

>gosh script.scm -sexp "identity"
Hello, world

>gosh script.scm -s "(^x (print x)(print x))"
Hello, world
Hello, world
#<undef>

>gosh script.scm -s "(lambda _ (use srfi-19 :only (current-date date->string))(current-date))"
#<date (32400)="" 12="" 14="" 2010="" 23:18:00.218750000="">

こんなんで良いのかな。

(use gauche.parseopt)

(define (main args)
  (let-args (cdr args)
      ((func "s|sexp=e" identity))
    (print ((eval func (interaction-environment)) "Hello, world"))))

追記

@valvallow 1引数決め打ちで、これはダメ? (define (main args) (print (eval `(,(read-from-string (cadr args)) "Hello, world") (interaction-environment))))
(define (main args)
  (print (eval `(,(read-from-string (cadr args)) "Hello, world")
               (interaction-environment))))

なるほどこっちが良いです!

追記2

@valvallow golf に挑戦してみた。 (print((eval(read-from-string(car *argv*))'user)"Hello, world"))
(print((eval(read-from-string(car *argv*))'user)"Hello, world"))

短い!

プログラミングGauche

2 件のコメント:

  1. ポータブルに書くならそれでokです。
    Gaucheでは、evalの第二引数は評価を行いたいモジュールを渡すので、独自にモジュールを作って渡してやることもできます (cf. make-module)。interaction-environmentは単にuserモジュール (gosh起動時のデフォルトモジュール)を返しているだけです。

    返信削除
  2. コメントありがとうございます。

    >Gaucheでは、evalの第二引数は評価を行いたいモジュールを渡すので、独自にモジュールを作って渡してやることもできます (cf. make-module)。interaction-environmentは単にuserモジュール (gosh起動時のデフォルトモジュール)を返しているだけです。

    そうだったんですか!もっとちゃんとリファレンスを読むようにします^^;

    返信削除