Archive for June 2005
Wilson, Douglas. Joy at the End of the Tether. Moscow, ID: Canon Press, 1999.
This book is a conversational walk through the book of Ecclesiastes. Douglas Wilson helped me to see for the first time the depth of wisdom and truth in Ecclesiastes. It is not exaggeration to say that Wilson has revolutionized my understanding of Ecclesiastes.
Previously I saw Ecclesiastes as portraying a world of emptiness and hopelessness, with an occasional disjointed glimmer of hope that there was some escape from the wasteland. But Wilson shows, conclusively I think, that Ecclesiastes is a unified whole. The world is full of vain repetition. But the message is not that we should become ascetics, forsaking the vain repetition of the world, for to do so rightly we would have to go out of the world! The message, rather, is that we should walk in faith, receive our lot as a gift from God, with appropriate joy and gratefulness. To the one who walks in unbelief, the vain repetition of this life brings nothing but despair. But to the one who walks in faith, trusting in God’s sovereignty and goodness, even the vain repetition of this life is a gift from God to be enjoyed.
This book has been tremendously helpful in encouraging me to walk in faith through difficulty and even tedium, challenging me to cultivate real gratefulness rather than a worldly gritty perseverance. This is part of faith’s growing in seeing all of life as being before the face of God (coram Deo).
I recommend this book very highly.
I’ve also encountered John Reisinger’s series titled “Thoughts on the Book of Ecclesiastes”. I don’t know much about Reisinger, nor have I yet done more than skim these articles. But Reisinger references Kaiser frequently, who was also one of Wilson’s primary sources. I’m retaining links to these articles for my reference; I don’t know yet whether I can recommend them: part 1, part 2, part 3, part 4, part 5, part 6, part 7, part 8.
Murray, John. Redemption Accomplished and Applied. Grand Rapids, MI: William B. Eerdmans Publishing Co., 1984.
The late John Murray presents a brief overview of Jesus’s work of redemption. This book is divided into two parts: Redemption Accomplished, which describes our need of a savior, God’s provision of a savior, and what Jesus accomplished on the cross; and Redemption Applied, which describes how all of redemption is worked out in the life of the believer.
This book was a helpful overview of Jesus’s work on the cross and of God’s work in bringing me to salvation.
Of all of the chapters, the one that was most provocative to me was the chapter on faith and repentance. Murray presents a wonderful reminder of where our assurance of salvation is located — nowhere other than Jesus himself.
Following are this and some other quotes I’ve collected from the book.
On Assurance (pp. 107ff)
Murray reminds us that our assurance does not consist in peering into the secret decrees of God to discern whether he loves us or has elected us unto salvation (see also The Difficult Doctrine of the Love of God), nor does it consist of our subjective sense of nearness to God. It consists in placing our trust here and now wholly in Jesus for mercy:
What warrant does a lost sinner have to commit himself to Christ? How may he know that he will be accepted? How does he know that Christ is able to save? How does he know that this confidence is not misplaced? How does he know that Christ is willing to save him? . . .
From whatever angle we may view [the offer of the gospel], it is full, free, and unrestricted. The appeals of the gospel cover the whole range of divine prerogative and of human interest. God entreats, he invites, he commands, he calls, he presents the overture of mercy and grace, and he does this to all without distinction or discrimination. . . .
When Christ is presented to lost men in the proclamation of the gospel, it is as Savior he is presented, as one who ever continues to be the embodiment of the salvation he has once for all accomplished. It is not the possibility of salvation that is offered to lost men but the Saviour himself and therefore salvation full and perfect. There is no imperfection in the salvation offered and there is no restriction to its overture — it is full, free, and unrestricted. And this is the warrant of faith.
The faith of which we are now speaking is not the belief that we have been saved but [it is] trust in Christ in order that we may be saved. And it is of paramount concern to know that Christ is presented to all without distinction to the end that they may entrust themselves to him for salvation. The gospel offer is not restricted to the elect or even to those for whom Christ died. And the warrant of faith is not the conviction that we are elect or that we are among those for whom, strictly speaking, Christ died but [it is] the fact that Christ, in the glory of his person, in the perfection of his finished work, and in the efficacy of his exalted activity as King and Saviour, is presented to us in the full, free, and unrestricted overture of the gospel. It is not as persons convinced of our election nor as persons convinced that we are the special objects of God’s love that we commit ourselves to him but as lost sinners. We entrust ourselves to him not because we believe we have been saved but as lost sinners in order that we may be saved. It is to us in our lost condition that the warrant of faith is given and the warrant is not restricted or circumscribed in any way. In the warrant of faith the rich mercy of God is proffered to the lost and the promise of grace is certified by the veracity and faithfulness of God. This is the ground upon which a lost sinner may commit himself to Christ in full confidence that he will be saved. And no sinner to whom the gospel comes is excluded from the divine warrant for such confidence.
On Union With Christ (pp. 162-163)
Murray presents an excellent summary of what it means to be in union with Christ. He writes that “if we did not take account of [union with Christ], not only would our presentation of the application of redemption be defective but our view of the Christian life would be gravely distorted. Nothing is more central or basic than union and communion with Christ” (p. 161). He goes on to enumerate what it means to be united with Christ:
The fountain of salvation itself in the eternal election of the Father is “in Christ.” . . . The Father elected from eternity, but he elected in Christ. . . .
It is also because the people of God were in Christ when he gave his life a ransom and redeemed by his blood that salvation has been secured for them; they are represented as united to Christ in his death, resurrection, and exaltation to heaven. . . .
It is in Christ that the people of God are created anew. “We are his workmanship, created in Christ Jesus unto good works” (Eph. 2:10). . . .
But not only does the new life have its inception in Christ; it is also continued by virtue of the same relationship to him. It is in Christ that Christian life and behavior are conducted. . . .
It is in Christ that believers die. They have fallen asleep in Christ or through Christ and they are dead in Christ (1 Thess. 4:14, 16). . . .
Finally, it is in Christ that the people of God will be resurrected and glorified. It is in Christ they will be made alive when the last trumpet will sound and the dead will be raised incorruptible (1 Cor. 15:22). It is with Christ they will be glorified (Rom. 8:17).
Small is the trust when love is green
In sap of early years;
A little thing steps in between
And kisses turn to tears.
Awhile – and see how love be grown
In loveliness and power!
Awhile, it loves the sweets alone,
But next it loves the sour.
A little love is none at all
That wanders or that fears;
A hearty love dwells still at call
To kisses or to tears.
Such then be mine, my love to give,
And such be yours to take:-
A faith to hold, a life to live,
For lovingkindness’ sake:
Should you be sad, should you be gay,
Or should you prove unkind,
A love to hold the growing way
And keep the helping mind:-
A love to turn the laugh on care
When wrinkled care appears,
And, with an equal will, to share
Your losses and your tears.
–Robert Louis Stevenson
A friend of mine is learning Python and was curious about functional programming, so I have written this brief tutorial. Python isn’t a full-fledged functional language, but it supports some very useful functional idioms.
It’s best to approach this tutorial by programming along at the Python interactive prompt. Try typing everything in to see what the results are.
Imagine you have a list of numbers and want to filter out all even numbers:
q = [1,2,5,6,8,12,15,17,20,23,24] def is_even(x) : return x % 2 == 0 result = filter(is_even, q)
(Remember that the “%” operator is the modulus or remainder operator. If the remainder when a number is divided by two is zero, then the number must be even.)
If we only use is_even once, it’s kind of annoying that we have to define it. Wouldn’t it be nice if we could just define it inside of the call to filter? We want to do something like “q = filter(x % 2 == 0, q)“, but that won’t quite work, since the “x % 2 == 0” is evaluated before the call to filter. We want to pass a function to filter, not an expression.
We can do this using the lambda operator. lambda allows you to create an unnamed throw-away function. Try this:
q = [1,2,5,6,8,12,15,17,20,23,24] result = filter(lambda x : x % 2 == 0, q)
lambda tells Python that a function follows. Before the colon (:) you list the parameters of the function (in this case, only one, x). After the colon you list what the function returns. This function doesn’t have a name, and Python disposes of it as soon as filter is done with it.
You can, however, assign the function to a variable to give it a name. The following two statements are identical:
def is_odd(x) : return x % 2 == 1 is_odd = lambda x : x % 2 == 1
Here’s another example. The map function applys a function to every item in a list, and returns the result. This example adds 1 to every element in the list:
result = map(lambda x : x + 1, [1,2,3,4,5])
(At this point, result holds [2,3,4,5,6].)
The map function can also process more than one list at a time, provided they are the same length. This allows you to do things like add all of the elements in a pair of lists. Note that our lambda here has two parameters:
result = map(lambda x,y : x+y, [1,2,3,4,5], [6,7,8,9,10])
(At this point, result holds [7, 9, 11, 13, 15].)
Python also provides the reduce function. This is a bit more complicated; you provide it a list and a function, and it reduces that list by applying the function to pairs of elements in the list. An example is the best way to understand this. Let’s say we want to find the sum of all the elements in a list:
sum = reduce(lambda x,y : x+y, [1,2,3,4,5])
reduce will first apply the function to 1,2, yielding 3. It will then apply the function to 3,3 (the first 3 is the result of adding 1+2), yielding 6. It will then apply the function to 6,4 (the 6 is the result of adding 3+3), yielding 10. Finally, it will apply the function to 10,5, yielding 15. The result stored in sum is 15.
Similarly, we can find the cumulative product of all items in a list. The following example stores 120 (=1*2*3*4*5) in product:
product = reduce(lambda x,y : x*y, [1,2,3,4,5])
Beginning in Python 2.5 you can even express conditions within your lambdas, using Python’s conditional expressions. So, for example:
reciprocals = map(lambda x : 1.0/x if x != 0 else None, [0, 1, 2, 3, 4, 5])
At this point, reciprocals holds the list [None, 1.0, 0.5, 0.333..., 0.25, 0.2]. The expression “1/x if x != 0 else None” is the conditional expression, and it is used to prevent division by zero. If x is not 0, then the result is 1/x, but otherwise it is None.
One of the advantages of lambda-functions is that they allow you to write very concise code. A result of this, however, is that the code is dense with meaning, and it can be hard to read if you are not accustomed to functional programming. In our first example, filter(is_even, q) was fairly easy to understand (fortunately, we chose a descriptive function name), while filter(lambda x : x % 2 == 0, q) takes a little longer to comprehend.
If you are a masochistic mathematical geek, you’ll probably enjoy this (I do). If not, you might still prefer to break things into smaller pieces by defining all of your functions first and then using them by name. That’s ok! Functional programming isn’t for everyone.
Another advantage of functional programming is that it corresponds very closely to the mathematical notion of functions. Note that our lambda-functions didn’t store any results into variables, or have any other sort of side effect. Functions without side effects cause fewer bugs, because their behavior is deterministic (this is related to the dictum that you aren’t supposed to use global variables). It is also much easier to mathematically prove that such functions do what you think they are doing. (Note that it’s still possible to write a lambda function that has side effects, if the lambda function calls another function that has side effects; for example lambda x : sys.stdout.write(str(x)) has the side effect of printing its parameter to the screen.)