문제

매우 특별한 곱셈 연산자가 필요하다고 말합니다. 다음 매크로에서 구현 될 수 있습니다.

macro @<<!(op1, op2)
{
    <[ ( $op1 * $op2 ) ]>
}

그리고 나는 그것을 사용할 수 있습니다

def val = 2 <<! 3

그리고 그 일.

그러나 내가 정말로 원하는 것은 지금 개발중인 DSL IM의 '영어'와 같은 운영자입니다.

macro @multiply(op1, op2)
{
    <[ ( $op1 * $op2 ) ]>
}

그리고 내가 그것을 사용하려고한다면

def val = 2 multiply 3

컴파일러는 '예상'으로 실패합니다. 오류

문제는 무엇입니까? 이 Infix-Format 매크로를 어떻게 구현할 수 있습니까?

도움이 되었습니까?

해결책

컴파일러 소스 코드에서 바로 :

namespace Nemerle.English
{
  [assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.English", "and", false, 160, 161)]
  [assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.English", "or", false, 150, 151)]
  [assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.English", "not", true, 181, 180)]  

  macro @and (e1, e2) {
    <[ $e1 && $e2 ]>
  }

  macro @or (e1, e2) {
    <[ $e1 || $e2 ]>
  }

  macro @not (e) {
    <[ ! $e ]>
  }

오퍼레이터를 뿌려야합니다. BTW, OperatorAttribute는 다음과 같이 정의됩니다.

public class OperatorAttribute : NemerleAttribute
{
  public mutable env : string;
  public mutable name : string;
  public mutable IsUnary : bool;
  public mutable left : int;
  public mutable right : int;
}

다른 팁

일반적으로 Comunity 응답보다 빨리 답변을 찾았습니다. :) 따라서 솔루션은 단순히 매크로를 이진 연산자로 지정하는 특수 어셈블리 레벨 속성을 사용하는 것입니다.

namespace TestMacroLib
{
  [assembly: Nemerle.Internal.OperatorAttribute ("TestMacroLib", "multiply", false, 160, 161)]
  public macro multiply(op1, op2)
  {
    <[ ( $op1 * $op2 ) ]>
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top