Nemerle 매크로의 Infix 형식
-
03-07-2019 - |
문제
매우 특별한 곱셈 연산자가 필요하다고 말합니다. 다음 매크로에서 구현 될 수 있습니다.
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 ) ]>
}
}
제휴하지 않습니다 StackOverflow