Недавно наткнлуся на любопытную статейку в которой чувачок поругивает js и всячески расхваливает схему, за ее якобы, простоту и выразительность.
Из следующей цитаты, можно понять пафос его «выступления».
Подход создателей Scheme все-таки предпочтительней. Если бы интерпретатор Scheme находился в каждом браузере, можно было бы писать приложения быстрее и проще, чем на JS. Это печальная, но сермяжная правда. Не надо запиливать фичу за фичей, как это сделано в ПХП, Пыхон, Перл, Цпп, и прочих. Ясно же, как божий день. :)
Он приводит там следующую реализацию ООП на схеме:
(define (make-vec2 x y)
(lambda (message)
(cond ((eq? message 'x) x)
((eq? message 'y) y))))
(define v (make-vec2 1 5))
(v 'x)
1
(v 'y)
5
(define (make-vec2 x y)
(lambda (message)
(cond ((eq? message 'x) x)
((eq? message 'y) y))))
> (define v (make-vec2 1 5))
> (v 'x)
1
> (v 'y)
5
Нда, ситуация «Нихерасе бахнуло...»
видать для кого-то это явилось шокирующим откровением, не иначе.
Не буду спорить о корректности и соответствии его кода концепции, хочу сказать о другом. Почему-то (как я понял из контекста его статьи) профессиональному разработчику на JS, не пришло в голову реализовать то же самое на самом JS?
Я сделал это за него, и получилось то же самое, тока чуть компактней и лаконичней.
mk_vec2=function(x, y){return function(msg){return eval(msg)}}
v=mk_vec2(1, 5)
v("x")// 1
v("y")// 5
mk_proto=function(field, prototype){
return function(msg){
try{return eval(msg)}catch(e){return prototype(msg)}
}
}
f=mk_proto("foobar", v)
f("field")// foobar
f("x")// 1
C-на вопрос, это че тренд такой - обсирать JS и превозносить Лисп?