Curl Global Community

Full Version: マクロ DE 文字列を扱うのが・・・
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
お久しぶりです。

マクロに関して奮闘中です。

nasuマクロの引数で、Identifierを受け取り、
それをoutputに文字列として渡すというマクロを作りました。

Code:
{define-macro public {nasu
                       ?v:identifier
                     }
    def l = {Literal v.name}
    {return {expand-template {output ?l}}}
}


このとき、{nasu BBB}は動くのですが、{nasu BBB.BBB}とすると
”.”がOperandとして認識されるようで、動かなくなったので、
?v:identifierを?v:expressionにしてみました。

Code:
{define-macro public {nasu
                        ?v:expression
                     }
    def l = {Literal {v.get-text}}
    {return {expand-template {output ?l}}}
}

ところが、BBB.BBBはLiteralとして扱えないようで、これも駄目だす。

そこで、トリッキーな感じで、messageでごまかそうと思いましたが、

Code:
{define-macro public {nasu
                        ?v:expression
                      }
    {return {expand-template {output {message ?v}}}}
}

これまたNG出されました!!!

だれか、ぷりーず・へるぷみー。。

マクロ難しい・・・・。

- B
これでどうでしょう?

Code:
{define-macro public {nasu
                         ?v:verbatim
                     }
  
    def src = {CurlSource.from-string
                  {format
                      |"{output "%s"}"|, {v.get-text}
                  }
              }
    {return {expand-template ?src}}
}
うぁおっ、ぬんっ!!できました。

ありがとうございます。

ちょっと強引っぽいですが、できればOKだす。。

-B
ストレートなやり方はこうだと思います。

Code:
{define-macro public {nasu
                         ?v:expression
                     }
    def lit = {Literal {{v.get-text}.to-String}}
    {return lit}
}


{Literal {v.get-text}} がエラーになるのは get-text の戻り値がmutableなSubStringオブジェクトなためなのでto-StringでimmutableなStringにしてやります。