CSC/ECE 517 Fall 2009/wiki2 1 SA: Difference between revisions
Jump to navigation
Jump to search
Line 9: | Line 9: | ||
== Metaprogramming in various languages == | == Metaprogramming in various languages == | ||
There are many languages that do metaprogramming. | |||
'''Metaprogramming in Groovy''' | |||
Below example demonstrates using classes from the Jakarta Commons Lang package for metaprogramming. All of the methods in org.apache.commons.lang.StringUtils coincidentally follow the Category pattern — static methods that accept a String as the first parameter. This means that you can use the StringUtils class right out of the box as a Category. | |||
import org.apache.commons.lang.StringUtils | |||
class CommonsTest extends GroovyTestCase{ | |||
void testStringUtils(){ | |||
def word = "Introduction" | |||
word.metaClass.whisper = {-> | |||
delegate.toLowerCase() | |||
} | |||
use(StringUtils, StringHelper){ | |||
//from org.apache.commons.lang.StringUtils | |||
assertEquals "Intro...", word.abbreviate(8) | |||
//from the StringHelper Category | |||
assertEquals "INTRODUCTION", word.shout() | |||
//from the word.metaClass | |||
assertEquals "introduction", word.whisper() | |||
} | |||
} | |||
} | |||
class StringHelper{ | |||
static String shout(String self){ | |||
return self.toUpperCase() | |||
} | |||
} | |||
== Examples == | == Examples == |
Revision as of 08:16, 9 October 2009
Metaprogramming
Introduction
Metaprogramming,is the creation of procedures and programs that automatically construct the definitions of other procedures and programs. Metaprogramming automates some of the tedious and error-prone parts of the programmer's job.
Metaprogramming in various languages
There are many languages that do metaprogramming. Metaprogramming in Groovy Below example demonstrates using classes from the Jakarta Commons Lang package for metaprogramming. All of the methods in org.apache.commons.lang.StringUtils coincidentally follow the Category pattern — static methods that accept a String as the first parameter. This means that you can use the StringUtils class right out of the box as a Category.
import org.apache.commons.lang.StringUtils
class CommonsTest extends GroovyTestCase{ void testStringUtils(){ def word = "Introduction"
word.metaClass.whisper = {-> delegate.toLowerCase() } use(StringUtils, StringHelper){ //from org.apache.commons.lang.StringUtils assertEquals "Intro...", word.abbreviate(8) //from the StringHelper Category assertEquals "INTRODUCTION", word.shout() //from the word.metaClass assertEquals "introduction", word.whisper() } } }
class StringHelper{ static String shout(String self){ return self.toUpperCase() } }