Lisp implementation in sed
github.com
github.com
More sed fun: http://aurelio.net/projects/sedsokoban/
On the other hand, awklisp has some value as a readable Lisp interpreter in a lower-level but still reasonable language, in between the usual Lisp-in-Lisp and Lisp-in-C tutorials.
I started playing with the idea of making a programming language out of sed at one point, but then I decided that, even if I succeeded, it would be a waste of time.
I didn't take into account Hacker News.
If you had to just write programs by running a series of sed substitution expressions to a file over and over, and not use conditionals... it might still be possible to program in. Much harder to think about, though.
This submission is in itself, an elegant proof that sed is Turing complete.
s2p: expression #1: extra characters after command (d)
Thankfully, I've never had the job of porting a sed script to Perl, so I'm not exactly sure what that's all about. The docs mention this error, but don't explain what it means,https://metacpan.org/pod/CljPerl
(there's a few, actually, because TIMTOWTDI!)
/(atom /{
/\[\S\+\]/{
s/.*/[]/
bpop_context
}
s/.*/t/
bpop_context
}Kudos, I think, to the author. His pain tolerance exceeds mine by a vast amount.
We started with nothing, remember? Just the bare metal. If this were the only available programming, I'd write an interpreter for a better language.
Never imagine that your current suite of tools is all there is.
I would bet on a compiler for a better language instead. That way, only one person would have to wait ages and ages. I doubt the result would be fast, but it wouldn't be insanely, insanely, insanely slow, either.
To what, I don't know.
Somehow it seems more likely that people are put off by the slightly "isolationist" culture of Lisp, or the historical clash between Lisp and Unix, or whatever, and then this "unreadable" idea is like a rationalization for not liking the language? This is just a hunch...
You could make all kinds of arguments for the difficulty and obscurity of Haskell, yet it's winning ground quite effectively. I think this basically started with the success of GHC and Cabal/Hackage in creating an infrastructure that's familiar and efficient.
The Lisp world always had good infrastructure engineering. The main compilers (SBCL, CMUCL, etc) are very impressive! But it takes a very intensive kind of community engagement nowadays to stay up to date.
I still think Lisp could have a renaissance. Maybe it's already going on with Clojure. And of course Emacs is quite strong.
The ideal of programming seems to be software architectures based on layers of coherent abstraction. That's very, um, abstract, and there are different ways to do it. With OO, you imagine objects cooperating in layers. With Haskell-like functional programming, you use a mathematical style of abstraction, trying to find theories and algebras that make sense and compose, building applications out of combinations of well-typed values, etc.
Paul Graham describes the Lisp style in his texts on Lisp. You can see it in Emacs's various DSLs (for defining customization parameters, for traversing buffers, etc). It encourages abstraction layers built so as to form mini-languages. So a library can easily provide custom syntactic forms. Instead of having a small number of syntactic forms (if, for, etc) and an expression language based on function application, Lisp is syntactically extensible.
Programming is not a solved problem! We still aren't really sure about how to design programs, how to create coherent abstraction layers. The Haskell approach is very interesting, but not totally fleshed out. People are still working out the best way to structure concurrent I/O pipelines with error handling, for example. I sort of lost my train of thought, but Lisp is very interesting!
I think it's really instructive to compare things written in the early days of Clojure to Clojure right now. Some times I just want to find the author of some code block, shake them, and yell "No! The only reader macros you are allowed to use are ', `, and #() !". Absolutely beautiful language, but way too easy to make unreadable.
Most Lisp code I've seen is heavy on the reader macros.
Compared to python or coffeescript, it feels like there's a lot less noise
grade = (student) ->
if student.excellentWork
"A+"
else if student.okayStuff
if student.triedHard then "B" else "B-"
else
"C"
(from coffescript examples)Imagine how many more symbols that would have in any lisp dialect
(defun grade (student)
(cond ((excellent-work student) :a+)
((okay-stuff student) (if (tried-hard student) :b :b-))
(t :c))) grade(#student{work=Work, tried_hard=Tried}) -> grade1(Work, Tried).
grade1(excellent_work, _) -> 'a+';
grade1(okay_stuff, yes) -> b;
grade1(okay_stuff, _) -> 'b-';
grade1(_, _) -> c.
Edit: formatting. grade(Student, Grade) :-
worked(Student, Work), work_grade(Work, Student, Grade).
work_grade('Excellent', _, 'A+').
work_grade('Okay', Student, 'B') :- tried_hard(Student).
work_grade('Okay', _, 'B-').
work_grade(_, _, 'C').
I'm a bit rusty, and I don't have a Prolog interpreter to hand to test, so I might have got some syntax wrong. dostuff(x)
is considered so much more readable than (dostuff x) ;; comparing with racket:
(define (grade student)
(cond
[(excellent-work student) "A+"]
[(and (okay-stuff student) (tried-hard student)) "B"]
[(okay-stuff student) "B-"]
[else "C"]))
;; Or
(require racket/match)
(define (grade student)
(match (map (lambda (fn) (fn student))
'(excellent-work okay-stuff tried-hard))
[(list #t _ _) "A+"]
[(list _ #t #t) "B"]
[(list _ #t _) "B-"]
[else "C"])) (defn grade [student]
(cond
(excellent-work student) "A+"
(okay-stuff student) (if (tried-hard student) "B" "B-")
:else "C"))