Listening To Reason

random musings about technologies by Andy Norris

03 September 2006

First Impressions of L#

Introduction

Lately I've been fooling around with Lisps. I've done some work on Linux in SBCL, an open source Common Lisp implementation that seems like a good, solid piece of code. But I've spent most of my time writing code in L#, an interpreted Lisp dialect for the .Net CLR. Lots of people are familiar with Common Lisp, but not all that many people seem to be familiar with L# yet, so I thought I would share my first impressions.

Like apparently everyone else who has started learning Lisp in the last five years, I got interested by reading Paul Graham. In particular, I didn't like the idea of programming in Blub without knowing more about some of the available alternatives.

So I've read Peter Seibel's Practical Common Lisp and I've started reading Paul Graham's On Lisp, and trying to learn how Lisp works.

Of course, if you keep reading Paul Graham, you also notice that he doesn't exactly endorse Common Lisp. He's been working on a newer, sexier Lisp called Arc, which of course you can't use yet. In particular, he argues the importance of having powerful, modern libraries.

It was somewhere around then that I ran across L#. L# was designed by Rob Blackwell with a lot of Graham's published ideas for Arc in mind. To me, at least, the language looks a little cleaner. In addition, it's designed to run on top of .Net, which means that even in its early stages, it comes with complete with a massive set of libraries for everything from XML to database access to user interfaces. When you add in the fact that I'm employed as a C# developer, so I already know those libraries pretty well, L# seemed like a no brainer to try out. So naturally, I did.

There's a lot to like about L#

If you're still with me at all, you're probably ready for me to move past the preamble and actually talk about L#. So here we go.

The single best thing about L# is exactly what you would expect: it combines a Lispy (and very clean) syntax with the massive library support of .Net. Want to do regular expressions? There's a .Net library that does all the heavy lifting. Hate all the gratuitous verbosity you get in .Net? Write a 5-line wrapper function and go to town.

Here's a really simple but real-life example: if L# comes with a concatenation operator, I haven't found it yet. I was doing a whole lot of string concatenation operations, and wanted an easy way to do it. In C# there are two basic ways to do string concatenation. The expensive way with clean syntax is to do:

mystring = foo + bar + baz + "\n";

which instantiates a new string for each concatenation operation. Meanwhile the efficent way with heinous syntax is to use a StringBuilder, which has a buffer so you don't have to reallocate space every time:

StringBuilder sb = new StringBuilder();
sb.Append(foo);
sb.Append(bar);
sb.Append(baz);
sb.Append("\n");
mystring = sb.ToString();

You could encapsulate a function for doing this, of course, and end up with something like:

string[] myarray = { foo, bar, baz, "\n" };
string mystring = MyStringLibrary.Concatenate(myarray);

That's a little better, but it's still kind of an eyesore. You can't declare the array inline as an argument to the function, and you have to carry around a class to hold the function name.

It won't surprise anyone familiar with Lisp, but L# makes it easy to make it easy. Here's my simple function to concatenate a list. I expect a Lisp guru could do something cooler, but I'm nowhere near a Lisp guru yet:

(= concat (fn (&rest members)
    (let sb (new system.text.stringbuilder)
      (foreach elem members
        (call append sb elem))
      (tostring sb))))

This yields a nice clean syntax for string concatenation, with all the advantages of the efficient, ugly way in C#, and a syntax as simple as adding strings together:

(concat foo bar baz "\n")

Actually, I seem to be using string concatenation enough that I think I'm going to rename the function ct, which should make things even more terse.

So anyway, that's just the simplest, scratch-the-surface example. Once you get into macros and things like that, I'm pretty sure that the differences will be even more dramatic.

L# shows enormous potential as a glue language for .Net applications: scripting, configuration, things like that. For scripting tasks, you can easily write simple, terse scripts that work with the code you've already built. I feel a little silly recommending a variant of possibly the most powerful programming languages ever devised as a way of scripting something written in C#, but it's a good way to get a foot in the door and add L# to your toolchain.

Steve Yegge has made a pretty compelling case for Lisp as a replacement for XML in things like config files and logs. I don't have much to add to that, but if you've ever gotten tired of messing around with XSLT transforms, L# offers an easy way to abandon them forever.

So utility programming in L# is pretty cool, but can you do more than that? Can you write real apps? I don't know yet. But I plan to find out. A language that's really powerful, but still fundamentally easy and fun to work with is worth experimenting with to find out how far you can take it.

I'm sure I won't be able to rip out years of production code and replace them all with L# -- really, I wouldn't want to, even if I could. But there's no reason not to look at it for new projects and interoperation. Currently, there's a few missing pieces for seamless interoperation with other .Net languages (mainly, L# doesn't compile into callable assemblies yet), but there's nothing standing in the way of getting those problems solved except time and effort.

L# Tools

The current tools for developing in L# aren't everything you could want, but they're not bad. First off, you can use Visual Studio, but there are no direct integration tools yet. Even without syntax highlighting, etc., this is still a pretty good solution. The main reason it works pretty well, is that it gives you the ability to debug your code. Well, sort of.

Actually, what you can do is load the C# source code for the LSharp interpreter into Visual Studio and debug the interpreter. You set breakpoints in places like Eval() and Call() and follow your code as it evaluates. This took a little adjusting to, but it actually works pretty well. You can drill down and see exactly what it's evaluating and how it's failing. Did you forget to quote something and send an unquoted symbol by mistake? It's all right there in the interpreter -- you can see what it's doing with your code.

Outside the debugger, the main advantage of using Visual Studio is that if you're integrating it with C# in the same solution, you can manage all the files in the same place. But really, to Visual Studio your L# files are just opaque text files.

Another tool I've worked with is TextPad, which is a feature-rich text editor for Windows that I use anyway. There's a syntax file for L# for TextPad, so it gives you syntax highlighting and parentheses matching (with ctrl-M). I often edit L# files in TextPad at the same time that I have the project open in Visual Studio, and Visual Studio has a handy reload dialog that pops up when files have changed.

There are other tools for working in C#, but I haven't had a chance to put them through their paces yet. xacc.ide is an integrated development environment being built that not only has support for L# syntax, it apparently uses L# as a scripting language. That certainly implies that xacc.ide will be a good tool for L# development. Finally, emacs support for L# has been developed, so if you're comfortable working in emacs, that may be just the ticket.

Conclusion

Of course, not everything in L# is ideal. I've run across some annoyances as I've been working in L#, as you would imagine for a young language. Nothing that is a showstopper, but a few things I wish worked a little better. The main thing, though, is that I haven't run into anything that has made me even want to consider abandoning L# for another language.

I'm hopeful that at least most of the annoyances can simply be fixed, so I'm going to write a followup post that goes into these in more detail, along with some ideas about what to do about them. This post is long enough as it is.

In the meantime, I hope this helps people know more about what to expect with L#, and I hope that people will go ahead and try it out. It's a solid language, and it potentially adds a whole new dimension to .Net projects.

Tags: , , , ,

48 Comments:

At 4:57 AM, Anonymous Anonymous said...

Andrew,

This is a great article - thanks for taking the time to document your experiences and thoughts.

You are abolutely correct when you say:

"there's nothing standing in the way of getting those problems solved except time and effort"

One of the nice things about L Sharp is that most good C# developers seem to be able to get to grips with the source code very quickly and it's easy to make changes and apply fixes to the interpreter. I welcome contributions.

Best Wishes,

Rob.

 
At 10:14 AM, Blogger Ryan Baker said...

Ever look at DotLisp?

Unlike L#, I believe it is actually compiles to bytecode, but I'm not totally sure. I haven't got the chance to use either yet, though I keep thinking about it, so it's nice to see your experiences.

 
At 3:04 PM, Blogger Jody said...

You can pass arrays inline to a function:

string mystring = MyStringLibrary.Concatenate(new string[] { foo, bar, baz, "\n" });

Or, you could declare Concatenate(params string[] arr) {}

and call as:
MyStringLibrary.Concatenate("foo", "bar", "baz", "\n" );

 
At 3:27 PM, Anonymous Anonymous said...

Here's another Lisp-like interpreter for .NET: Tachy (http://www.kenrawlings.com/pages/Tachy). It's based on Scheme rather than Common Lisp. I haven't played with it.

When I came across it 6 months ago it seemed to be a more active project than dotLisp. However the last activity seems to have been Aug 2005 so I don't know if the sole developer is still working on it or not.

Cheers
Simon Te W

 
At 7:54 PM, Anonymous Anonymous said...

You say that this is inefficient:

mystring = foo + bar + baz + "\n";

I'm not 100% sure if this is true of C#, but if C# is anything like Java (and it is a lot like Java), then this will be implemented internally using a StringBuilder (StringBuffer in Java-speak).

 
At 8:33 PM, Blogger AN said...

ryan,

I looked at DotLisp. The main thing I didn't like is that it didn't seem to still be under active development.

I don't think that DotLisp compiles to bytecode, but I have only spent a little time inside the the source, so I could be mistaken.

Beyond that, there are some aesthetic differences, but I think L# and DotLisp are probably more similar than they are different.

 
At 8:34 PM, Blogger AN said...

jody,

Thanks. I always forget about the varargs syntax for C#. That does clean up the example code considerably.

 
At 8:38 PM, Blogger AN said...

>> I'm not 100% sure if this is true of C#, but if C# is anything like Java (and it is a lot like Java), then this will be implemented internally using a StringBuilder (StringBuffer in Java-speak).

A couple of years ago, someone I was working with ran a simple test that appended a bunch (100,000 maybe?) of strings inside a loop, and it was orders of magnitude faster with a StringBuilder. I think simple cases may be optimized, but other cases don't seem to be.

 
At 3:33 AM, Blogger zproxy said...

see string.Concat :)

 
At 3:51 AM, Anonymous Luke Plant said...

... and, more nitpicking:

Very often the C# compiler can turn your '+' code into string.Concat() calls anyway, which is a lot faster than StringBuilder, so unless you have a loop with a potentially large number of items, using '+' is fine.

 
At 10:23 AM, Blogger AN said...

You know, I completely forgot that string had a static concat method. I've never actually seen anyone use it. :-)

 
At 6:03 PM, Blogger ghkj said...

This momentousdecree warcraft leveling came as a great beacon light wow lvl of hope to millions of negroslaves wow power level who had been seared power leveling in the flames of power leveling withering wrath of the lich king power leveling injustice.wrath of the lich king power leveling it came as a WOTLK Power Leveling joyous daybreak to end the long WOTLK Power Leveling night ofcaptivity.WOTLK Power Leveling but one hundred years wlk power leveling later, we must face aoc gold the tragic fact thatthe age of conan power leveling negro is still not free. aoc power leveling one hundred years later,age of conan power leveling the lifeof the negro ffxi gil is still sadly crippled by the final fantasy xi gil manacles ofsegregation guild wars gold and the chains of discrimination. one hundred yearslater, maplestory mesos the negro lives on a lonely island of poverty in themidst of a vast ocean of material prosperity.dog clothes one hundred yearslater

 
At 2:56 AM, Anonymous Anonymous said...

Ultima Online Gold, UO Gold, crestingwait
buy uo gold
buy uo gold
buy uo gold
buy uo gold
buy uo gold
buy uo gold
buy uo gold
buy uo gold
buy uo gold
buy uo gold
lotro gold
wow gold
warhammer gold
buy aoc gold
buy aoc gold
buy aoc gold
buy aoc gold
buy aoc gold
buy aoc gold
buy aoc gold
Age of Conan Gold, AOC Gold

 
At 8:19 AM, Anonymous Anonymous said...

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with Cheapest wow gold monsters and traverse the countryside, by yourself or as a buy cheap wow gold team, find challenging tasks, and go on to higher Cheap Wow Gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and cheapest wow gold playing it is another experience altogether.
Even though WoW is a wow gold cheap rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game World Of Warcraft Gold immediately. If on the other hand, you need a detailed manual, the instructions are there for you to access. Buy wow gold in this site,good for you ,WoW Gold, BUY WOW GOLD.

 
At 9:16 PM, Anonymous Anonymous said...

I was very like to play the Rohan online game, in my mind I can gave up all things but I can not gave up the rohan crone, it gave me the courage and the confidence, in the game I was very like to earn the rohan gold, but I also need to buy rohan crone, but the same time I know a website sell the cheap rohan crone, so if you want to buy, I suggest you come here.

 
At 11:31 PM, Anonymous Anonymous said...

It is the knight noah which makes me very happy these days, my brother says knight gold is his favorite games gold he likes, he usually knight online gold to start his game and most of the time he will win the knight online noah back and give me some cheap knight gold to play the game.

 
At 1:19 AM, Blogger game gold said...

Buy World of Kung fu Gold is the chance. I always have a bad dream when my account was theft, since I buy World of Kung fu Gold ; I had not had the bad memory. At present, I want to say thanks to the people who stole my account, if he did not to do that, I would not play game, I would not have WoKf gold . Although I have little cheap World of Kung fu Gold , I will on the way of the game for long time. At one time or another, I am a pessimistic person, but when I have World of Kung fu money , it changes my attitude of life.

Remembered the first time I played the game and bought Lineage 2 gold , it is about two years. Since the first day I bought Lineage gold , we should know that the day will come sooner or later. And I will not leave my Lineage money . My friends forever, even though I will leave you one day, I will remember you forever. At that time, I was a naive; I must used money to have Lineage 2 money , as that I would not depend on myself. But I was not regret to buy it. It is just a way bring me to the success.

 
At 2:29 AM, Anonymous Anonymous said...

Do you know buy lindens? I like it.
My brother often go to the internet bar to buy second life linden and play it.
After school, He likes playing games using these cheap linden with his friends.
I do not like to play it. Because I think that it not only costs much money but also spend much time. One day, he give me many linden dollars and play the game with me.
I came to the bar following him and found secondlife money was so cheap. After that, I also go to play game with him.

Do you know shadow of legend Gold? I like it..
My brother often go to the internet bar to buy sol gold and play it.
After school, He likes playing games using these buy shadow of legend Gold with his friends.
I do not like to play it. Because I think that it not only costs much money but also spend much time. One day, he give me many cheap shadow of legend Goldand play the game with me.
I came to the bar following him and found shadow of legend Gold moneywas so cheap. After that, I also go to play game with him.

 
At 5:28 PM, Blogger belrion16 said...

buy wow goldAsesor ProfessionalUruguayProfessionalbuy wow goldOfficeLinksNotice

 
At 4:47 AM, Blogger 梦中林 said...

A slim, wide-eyed mygamegoldwoman almost human in virbanksfeatures eyed agamegold the pair. Her nose was sharp, but very elegant. She had tbcgold a pale, trade4gamebeautiful face the color of ivory, and veryge for hair she wore a wondrous mane of downy feathers. Her gown fluttered as she walked—on two delicate worldofgolds but still sharply-taloned feet. “Awake, awake you are,” she said with a pvp365 slight frown. “You should rest, rest.” Krasus bowed to her. “I am ezmmorpg grateful for your ighey hospitality, mistress, but I am well enough to continue on9a9z now.” She cocked her head as a bird might, giving the mageltk365 a reproving look. “No, no…too soon, toogold4guild soon. Please, sit.” The duo looked around u4game and discovered that two chairs, made in the same ready4game fashion as the nest, waited behind happygolds them. Malfurion waited for Krasus, who finally nodded and sat.

 
At 5:23 AM, Blogger buy wow gold said...

When the Wow Gold wolf finally found the wow gold cheap hole in the chimney he crawled cheap wow gold down and KERSPLASH right into that kettle of water and that was cheapest wow gold the end of his troubles with the big bad wolf.

game4power.
The next day the Buy Wow Goldlittle pig invited hisbuy gold wow mother over . She said "You see it is just as Cheapest wow goldI told you. The way to get along in the world is to do world of warcraft gold things as well as you can." Fortunately for that little pig, he buy cheap wow gold learned that lesson. And he just wow gold lived happily ever after!.

 
At 12:10 AM, Blogger 梦中林 said...

A slim, wide-eyed mygamegoldwoman almost human in virbanksfeatures eyed agamegold the pair. Her nose was sharp, but very elegant. She had tbcgold a pale, trade4gamebeautiful face the color of ivory, and veryge for hair she wore a wondrous mane of downy feathers. Her gown fluttered as she walked—on two delicate worldofgolds but still sharply-taloned feet. “Awake, awake you are,” she said with a pvp365 slight frown. “You should rest, rest.” Krasus bowed to her. “I am ezmmorpg grateful for your ighey hospitality, mistress, but I am well enough to continue on9a9z now.” She cocked her head as a bird might, giving the mageltk365 a reproving look. “No, no…too soon, toogold4guild soon. Please, sit.” The duo looked around u4game and discovered that two chairs, made in the same ready4game fashion as the nest, waited behind happygolds them. Malfurion waited for Krasus, who finally nodded and sat.

 
At 1:35 AM, Blogger buy wow gold said...

There are several tbcgold races stand up and take the fightakgame to the demons under assault by the Legion. The races are unaligned at character mygamestock start, and can choose to become ttgaming friendly with either Horde or Alliance over the course of their careers. Faction gained belrion with one side eventually live4game causes faction loss with the other, until the character is as much Horde or Alliance as an Orc or mmopawn Human. Each race has awowgoldget starting city with 1-20 zone content.
When you hunt, the enemies you agamegoldkill drop items, and even the most useless ones can be sold to vendors for money. Quests trade4game on the other hand give up rewards in money and items, the money gamersell part is most useful as it is usually a large sum world of warcraft rpg-tradergold. Crafting is also another alternative for earning Gold, you just choose wowpoweronany two professions and use it to gather raw materials or create gamegoodyitems which you can sell to vendors or players. Items sell egrichhigher to players since vendors have a set price and people always want to buy wow gold us ogpalat a lower price than the vendor but sell at a higher price, so there usually is a euwowgoldmiddle price world of warcraft gold. To see what the going ratemymmoshop is, type in "PC" (Price Check) in the Trade Chat window and the item you want to price check and someone should reply with the going-rate for that item

 
At 7:27 PM, Anonymous Anonymous said...

Do you want to know the magic of online games, and here you can get more FFXI Gil. Do you want to have a try? Come on and FFXI gold can make you happy. You can change a lot Final Fantasy XI gold for play games. Playing online games can make much buy FFXI Gil. And you will be happy at the same time. And you can use the cheap Final Fantasy XI Gold do what you want to do in the online game.

 
At 7:27 PM, Anonymous Anonymous said...

What do you know aoc gold. And do you want to know? You can get conan gold here. And welcome to view our website, here you can play games, and you will get age of conan gold to play game. I know cheap aoc gold, and it is very interesting. Do you want a try, come and view our website, and you will learn how to aoc money. Come and join with us. We are waiting for your coming.

 
At 7:27 PM, Anonymous Anonymous said...

Do you want to know the magic of online games, and here you can get more Sho Online Mun. Do you want to have a try? Come on and Sho Mun can make you happy. You can change a lot Sho Online gold for play games. Playing online games can make much Sho gold. And you can buy Sho Online gold do what you want to do in the online game.

 
At 7:56 PM, Anonymous Anonymous said...

Do you know fiesta Gold? I like it. My brother often go to the internet bar to buy fiesta money and play it. After school, He likes playing games using these fiesta online gold with his friend. I think that it not only costs much money but also spend much time. One day, he give me many buy fiesta Gold and play the game with me. I came to the bar following him and found fiesta online money was so cheap.

 
At 7:56 PM, Anonymous Anonymous said...

Do you know cabal online alz? I like it. My brother often go to the internet bar to buy cabal alz and play it. After school, He likes playing games using these cabal gold with his friend. I do not like to play it. Because I think that it not only costs much money but also spend much time. One day, he give me many cabal money and play the game with me. I came to the bar following him and found buy cabal alz was so cheap. After that, I also go to play game with him.

 
At 7:56 PM, Anonymous Anonymous said...

Do you know Asda Story gold? I like it. My brother often goes to the internet bar to buy Asda Story money and play it. After school, He likes playing games using these buy Asda Story Gold with his friend. I do not like to play it. Because I think that it not only costs much money but also spend much time. One day, he give me manycheap Asda Story gold and play the game with me.

 
At 8:15 PM, Anonymous Anonymous said...

Have you heared about a game which you need use Anarchy credits to play, and you can also borrow Anarchy Online credits from other players? But you can buy AO credits, or you will lose the choice if you do not have Anarchy online gold. If you get Anarchy gold, you can continue this game.

 
At 8:20 PM, Anonymous Anonymous said...

Have you heared about 9Dragons which you need use 9Dragons gold to play, and you can also borrow 9 Dragons gold from other players? But you can buy 9 Dragons gold, or you will lose the choice if you do not have cheap 9Dragons gold. If you get 9Dragons money, you can continue this game.

 
At 8:22 PM, Anonymous Anonymous said...

Have you heared about the game which you need use Atlantica online Gold to play, and you can also borrow Atlantica Gold from other players? But you can buy Atlantica online Gold, or you will lose the choice if you do not have cheap Atlantica online Gold. If you get Atlantica online money,

 
At 11:57 PM, Anonymous Anonymous said...

I like holic gold very much. Since I entered into this game, I learnt skills to earn holic money. Thanks to holic online gold let me know a lot of friends. It is my habit to buy holic online money, and I get some cheap holic gold from my friends and Internet.

 
At 11:58 PM, Anonymous Anonymous said...

I think 4story Luna changes my life. Because of 4story Gold, I meet a lot of friends. Besides, my friends usually give me some 4story money. I usually buy 4story Luna through Internet and advice from my friends, so I gain a lot of cheap 4story Luna and harvest in life.

 
At 11:58 PM, Anonymous Anonymous said...

I like to play last chaos, because I like its name, also I like last chaos gold. My friend told me that she would buy lastchaos gold for me, and I was so happy. I do not like to go shopping, because it always spends a lot of money, but I never hesitate to buy last chaos gold. You can buy cheap lastchaos gold; it is so easy and convenient. I believe the future of lastchaos money is bright.

 
At 12:51 AM, Anonymous Anonymous said...

I am so happy to get some maple mesos and the mesos is given by my close friend who tells me that the cheap mesos is the basis to enter into the game. Therefore, I should maplestory mesos with the spare money and I gain some maple story mesos from other players.

 
At 12:51 AM, Anonymous Anonymous said...

I always heard something from my neighbor that he sometimes goes to the internet bar to play the game which will use him some Metin2 gold, he usually can win a lot of Metin2 yang, then he let his friends all have some Cheap metin2 yang, his friends thank him very much for introducing them the Cheap metin2 gold, they usually Buy metin2 gold together.

 
At 12:51 AM, Anonymous Anonymous said...

I always heard something from my neighbor that he sometimes goes to the internet bar to play the game which will use him some Solstice Kron, he usually can win a lot of Solstice Online Kron, then he let his friends all have some Solstice Gold, his friends thank him very much for introducing them the Solstice Online Gold, they usually buy Solstice Kron together. And then share their cheap Solstice Kron to each other. At last they all get some Solstice Online money than before.

 
At 1:36 AM, Anonymous Anonymous said...

You smart and buy Sword of the New World Vis, you play the game is right, Sword of the New World Gold. you have a wonderful time, buy vis, I have it cheap snw vis, I buy Sword of the New World money.

 
At 1:36 AM, Anonymous Anonymous said...

It is the ro zeny which make me very happy these days, my brother says ragnarok zeny is his favorite games gold he likes, he usually buy some iro zeny to start his game and most of the time he will win the cheap zeny back and give me some ragnarok online zeny to play the game.

 
At 1:37 AM, Anonymous Anonymous said...

I always heard something from my neighbor that he sometimes goes to the internet bar to play the game which will use him some Solstice Kron, he usually can win a lot of Solstice Online Kron, then he let his friends all have some Solstice Gold, his friends thank him very much for introducing them the Solstice Online Gold, they usually buy Solstice Kron together. And then share their cheap Solstice Kron to each other. At last they all get some Solstice Online money than before.

 
At 1:37 AM, Anonymous Anonymous said...

I am so happy to get some LOTRO Gold and the Lord Of The Rings Gold is given by my close friend who tells me that the buy LOTRO Gold is the basis to enter into the game. Therefore, I should buy Archlord gold with the spare money and I gain some cheap Lord Of The Rings Gold from other players.

 
At 1:37 AM, Anonymous Anonymous said...

You smart and buy Sword of the New World Vis, you play the game is right, Sword of the New World Gold. you have a wonderful time, buy vis, I have it cheap snw vis, I buy Sword of the New World money.

 
At 1:38 AM, Anonymous Anonymous said...

I want give they happy time, twelve sky Gold, I work here with 12sky gold. Though, I can not make much money, twelvesky Gold, But I want to Exercise myself, 12Sky Silver Coins, I get up early 12 sky gold

 
At 12:33 PM, Anonymous Anonymous said...

dessicant air dryerpediatric asthmaasthma specialistasthma children specialistcarpet cleaning dallas txcarpet cleaners dallascarpet cleaning dallas

vero beach vacationvero beach vacationsbeach vacation homes veroms beach vacationsms beach vacationms beach condosmaui beach vacationmaui beach vacationsmaui beach clubbeach vacationsyour beach vacationscheap beach vacations

bob hairstylebob haircutsbob layeredpob hairstylebobbedclassic bobCare for Curly HairTips for Curly Haircurly hair12r 22.5 best pricetires truck bustires 12r 22.5

washington new housenew house houstonnew house san antonionew house ventura

 
At 12:33 PM, Anonymous Anonymous said...

new houston house houston house txstains removal dyestains removal clothesstains removalteeth whiteningteeth whiteningbright teeth

jennifer grey nosejennifer nose jobscalebrities nose jobsWomen with Big NosesWomen hairstylesBig Nose Women, hairstyles

 
At 12:34 PM, Anonymous Anonymous said...

black mold exposureblack mold symptoms of exposurewrought iron garden gatesiron garden gates find them herefine thin hair hairstylessearch hair styles for fine thin hairnight vision binocularsbuy night vision binocularslipitor reactionslipitor allergic reactionsluxury beach resort in the philippines

afordable beach resorts in the philippineshomeopathy for eczema.baby eczema.save big with great mineral makeup bargainsmineral makeup wholesalersprodam iphone Apple prodam iphone prahacect iphone manualmanual for P 168 iphonefero 52 binocularsnight vision Fero 52 binocularsThe best night vision binoculars here

night vision binoculars bargainsfree photo albums computer programsfree software to make photo albumsfree tax formsprintable tax forms for free craftmatic air bedcraftmatic air bed adjustable info hereboyd air bedboyd night air bed lowest price

 
At 12:35 PM, Anonymous Anonymous said...

find air beds in wisconsinbest air beds in wisconsincloud air beds

best cloud inflatable air bedssealy air beds portableportables air bedsrv luggage racksaluminum made rv luggage racksair bed raisedbest form raised air bedsbed air informercialsbest informercials bed airmattress sized air beds

bestair bed mattress antique doorknobsantique doorknob identification tipsdvd player troubleshootingtroubleshooting with the dvd playerflat panel television lcd vs plasmaflat panel lcd television versus plasma pic the bestadjustable bed air foam The best bed air foam

hoof prints antique equestrian printsantique hoof prints equestrian printsBuy air bedadjustablebuy the best adjustable air bedsair beds canadian storesCanadian stores for air beds

migraine causemigraine treatments floridaflorida headache clinicdrying dessicantair drying dessicant

 

Post a Comment

Links to this post:

Create a Link

<< Home