>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"))))
- Gauche ユーザリファレンス: 3.3 Schemeスクリプトを書く
- Gauche ユーザリファレンス: 9.16 gauche.parseopt - コマンドライン引数の解析
- Gauche ユーザリファレンス: 10.12 srfi-37 - args-fold プログラム引数処理
追記
@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"))
短い!
ポータブルに書くならそれでokです。
返信削除Gaucheでは、evalの第二引数は評価を行いたいモジュールを渡すので、独自にモジュールを作って渡してやることもできます (cf. make-module)。interaction-environmentは単にuserモジュール (gosh起動時のデフォルトモジュール)を返しているだけです。
コメントありがとうございます。
返信削除>Gaucheでは、evalの第二引数は評価を行いたいモジュールを渡すので、独自にモジュールを作って渡してやることもできます (cf. make-module)。interaction-environmentは単にuserモジュール (gosh起動時のデフォルトモジュール)を返しているだけです。
そうだったんですか!もっとちゃんとリファレンスを読むようにします^^;