Jadi saya ingin mendefinisikan makro yang memperkenalkan beberapa variabel sebagai deklarasi variabel sehingga nama didefinisikan oleh pengguna makro.

Katakan bahwa saya ingin dapat menulis sesuatu seperti berikut ini.

foldOver(0)(hd, rest)(List(1, 2, 3)) {
  hd + rest
}

Pikiran pertama saya tentang bagaimana melakukan ini adalah membuat parameter variabel dan memeriksanya secara manual dalam beberapa cara. Saya akhirnya bermain-main dengan definisi seperti berikut.

def foldOver[A, B](z : B)(next : A, acc : B)(lst : List[A])(f : B): B = macro foldOverImpl[A, B]
def foldOverImpl[A : c.WeakTypeTag, B : c.WeakTypeTag]
                (c: Context)
                (z : c.Expr[B])(next : c.Expr[A], acc : c.Expr[B])
                (lst : c.Expr[List[A]])
                (f : c.Expr[B]): c.Expr[B] = {
    import c.universe._
    (next, acc) match {
      case (TermName(nextName), TermName(accName)) => {
        c.Expr[B](q"""{
          <do whatever here>
        }""")
      }
      case otherwise => {
        throw new Exception("the 'next' and 'acc' variables must be term names")
      }
    }
}

Tetapi ketika saya menggunakan makro seperti yang ditunjukkan di atas yang memberi saya kesalahan yang mengatakan bahwa ia tidak dapat menemukan nama variabel tersebut dalam program. Seharusnya tidak, saya ingin itu dideklarasikan di dalam makro dan bukan konteks yang mengandung.

Jadi, apakah ada cara untuk menerima nama dari pengguna dan menggunakannya untuk mendeklarasikan variabel dalam makro?

1
Jake 20 Mei 2015, 23:10
Tidak mungkin melakukan ini di makro def, karena makro def memerlukan semua argumen mereka untuk typecheck sebelum ekspansi. Anotasi makro tidak memiliki batasan ini, tetapi memiliki sintaks berbeda yang mungkin tidak sesuai untuk kasus penggunaan Anda.
 – 
Eugene Burmako
21 Mei 2015, 11:12
Ya, saya rasa anotasi makro tidak akan berfungsi dengan baik untuk saya setelah melihatnya. Saya hanya bisa menggunakan lambdas untuk mendapatkan efek yang saya inginkan. Saya tahu ini hanya kalimat singkat tetapi ini menjawab pertanyaan saya. Jangan ragu untuk memposting jawabannya.
 – 
Jake
21 Mei 2015, 21:02

1 menjawab

Jawaban Terbaik

Tidak mungkin melakukan ini di makro def, karena makro def memerlukan semua argumen mereka untuk typecheck sebelum ekspansi. Anotasi makro tidak memiliki batasan ini, tetapi memiliki sintaks berbeda yang mungkin tidak sesuai untuk kasus penggunaan Anda.

1
Eugene Burmako 22 Mei 2015, 01:02