Implement patsubt function
diff --git a/eval.go b/eval.go
index 75009a8..e3b90ae 100644
--- a/eval.go
+++ b/eval.go
@@ -32,6 +32,7 @@
 		vars:    vars,
 		funcs: map[string]Func{
 			"subst":    funcSubst,
+			"patsubst": funcPatsubst,
 			"wildcard": funcWildcard,
 			"shell":    funcShell,
 			"warning":  funcWarning,
diff --git a/func.go b/func.go
index 5d527ca..c4408a0 100644
--- a/func.go
+++ b/func.go
@@ -15,6 +15,7 @@
 
 func funcSubst(ev *Evaluator, args []string) string {
 	Log("subst %q", args)
+	// TODO: Actually, having more than three arguments is valid.
 	if len(args) != 3 {
 		panic(fmt.Sprintf("*** insufficient number of arguments (%d) to function `subst'."))
 	}
@@ -24,6 +25,21 @@
 	return strings.Replace(text, from, to, -1)
 }
 
+func funcPatsubst(ev *Evaluator, args []string) string {
+	Log("patsubst %q", args)
+	// TODO: Actually, having more than three arguments is valid.
+	if len(args) != 3 {
+		panic(fmt.Sprintf("*** insufficient number of arguments (%d) to function `patsubst'."))
+	}
+	pat := ev.evalExpr(args[0])
+	repl := ev.evalExpr(args[1])
+	texts := splitSpaces(ev.evalExpr(args[2]))
+	for i, text := range texts {
+		texts[i] = substPattern(pat, repl, text)
+	}
+	return strings.Join(texts, " ")
+}
+
 // http://www.gnu.org/software/make/manual/make.html#File-Name-Functions
 func funcWildcard(ev *Evaluator, args []string) string {
 	Log("wildcard %q", args)