[#42643] メールのSMTP認証の方法(質問) — "Hisashi Yahata" <yahatah@...>

お世話になります。

34 messages 2006/08/09
[#42649] Re: メールのSMTP認証の方法(質問) — OHARA Shigeki <os@...> 2006/08/09

大原です。

[#42650] Re: メールのSMTP認証の方法(質問) — "Hisashi Yahata" <yahatah@...> 2006/08/09

大原様

[#42651] Re: メールのSMTP認証の方法(質問) — 植田裕之 <ueda@...> 2006/08/09

植田と申します。

[#42654] Re: メールのSMTP認証の方法(質問) — "Hisashi Yahata" <yahatah@...> 2006/08/09

植田 裕之様

[#42657] Re: メールのSMTP認証の方法(質問) — WATANABE Tetsuya <Tetsuya.WATANABE@...> 2006/08/09

渡辺哲也です。

[ruby-list:42722] Re: in演算子の提案

From: "Hiroyuki Iwatsuki" <don@...>
Date: 2006-08-19 05:33:11 UTC
List: ruby-list #42722
岩月と申します。

ruby-devネタかもと思いつつこちらへ。
in演算子は面白いと思いましたので、
ためしにCVS HEADで実装してみました。

% ruby -ve "ary = [1, 2, 3];s = 1;if s in ary; p(true); end"
ruby 1.9.0 (2006-08-19) [i386-freebsd6.1]
true

内部で右辺オブジェクトのinclude?メソッドを呼び出しますので、
include?を持っていないオブジェクトを右辺に置くとエラーになります。
エラーメッセージに生々しくinclude?と出ます(改善の余地あり?)。

% ruby -ve "n = 100;s = 1;if s in n; p(true); end"
ruby 1.9.0 (2006-08-19) [i386-freebsd6.1]
-e:1: undefined method `include?' for 100:Fixnum (NoMethodError)

andやorと同じような扱いですので、
メソッドの引数に使うときは括弧を2重にします。

% ruby -ve "p(1 in [1, 2, 3])"
ruby 1.9.0 (2006-08-19) [i386-freebsd6.1]
-e:1: syntax error, unexpected keyword_in, expecting ')'
p(1 in [1, 2, 3])
      ^
-e:1: syntax error, unexpected ')', expecting $end

% ruby -ve "p((1 in [1, 2, 3]))"
ruby 1.9.0 (2006-08-19) [i386-freebsd6.1]
true


この実装自身はともかく、in演算子は見た目わかりやすくなって
好印象です。Ruby 1.8.xへの導入には躊躇しますが、
Ruby 1.9への導入には賛同します。

# やっぱり ruby-dev ネタかな。

-- 
IWATSUKI Hiroyuki <URL:mailto:don@na.rim.or.jp>

Attachments (1)

ruby-parser.y-1.451-in.diff (755 Bytes, text/x-diff)
--- parse.y	19  8 2006 12:58:33 +0900	1.451
+++ parse.y	19  8 2006 13:45:05 +0900	
@@ -588,7 +588,7 @@ static void ripper_compile_error(struct 
 %nonassoc tLBRACE_ARG
 
 %nonassoc  modifier_if modifier_unless modifier_while modifier_until
-%left  keyword_or keyword_and
+%left  keyword_or keyword_and keyword_in
 %right keyword_not
 %nonassoc keyword_defined
 %right '=' tOP_ASGN
@@ -1025,6 +1025,14 @@ stmt		: keyword_alias fitem {lex_state =
 		;
 
 expr		: command_call
+                | expr keyword_in expr
+                    {
+		      /*%%%*/
+		        $$ = call_op($3, rb_intern("include?"), 1, $1);
+		      /*%
+			$$ = dispatch3(binary, $1, ripper_intern("in"), $3);
+		      %*/
+		    }
 		| expr keyword_and expr
 		    {
 		    /*%%%*/

In This Thread