Gauche > Archives > 2012/08/31

2012/08/31 04:58:55 UTCyamasushi
#
gosh> #!c-expr {{1 cons 2} cons '()}
((1 . 2))
gosh> #!c-expr {1 cons {2 cons '()}}
(1 2)
gosh> #!c-expr {1 cons 2 cons '()}
*** ERROR: Compile Error: wrong number of arguments: cons requires 2, but got 3

Stack Trace:
_______________________________________
  0  (eval expr env)
        At line 173 of "/usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/interactive.scm"
#
これはどこがまずいのでしょうか?
2012/08/31 05:03:46 UTCshiro
#
{1 cons 2 cons '()} は (cons 1 2 '()) と読まれます。
2012/08/31 05:04:38 UTCyamasushi
#
gosh> #!c-expr {1 cons* 2 cons* '()}
(1 2)
#
なるほど!ありがとうございます。
2012/08/31 05:06:41 UTCshiro
#
ふーむ、これもユーザの期待 (x op y op z ではbinaryなopが結合規則で畳まれることを期待) と反する例ではあるな。とはいえ、この規則によって {0 < x < 4} と書けるので良し悪しですが。
2012/08/31 05:20:18 UTCyamasushi
#
gosh> (define x '( (1 2 3) (4 5 6) 3 4))
x
gosh> x
((1 2 3) (4 5 6) 3 4)
gosh> (ref (ref x 1) 1)
5
gosh> #!c-expr {{x ref 1} ref 1}
5
gosh> #!c-expr { x ref 1 ref 1}
*** ERROR: no applicable method for #<generic ref (9)> with arguments (((1 2 3) (4 5 6) 3 4) 1 1)
Stack Trace:
_______________________________________
  0  (eval expr env)
        At line 173 of "/usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/interactive.scm"
#
refの多段参照ができるかと思ったのですが、この規則からするとエラーになるんですね。
2012/08/31 05:32:05 UTCshiro
#
refは多段で動くようにはかかれてないので。 {x ~ 1 ~ 1} なら動きませんか。
2012/08/31 06:59:53 UTCyamasushi
#
なるほど、動きました。これはいいですね。