Comments 72
ДиапАзон.
-1
Имхо, такое малозаметное различие между [0..10] и [0...10] не очень хорошо для «языка», который делался «для упрощения и разработки более качественного кода».
+12
Когда-то из-за точек в фортране падали космические корабли, а сейчас из-за точек в кофе просто не будут работать сайты. Прогресс налицо!
Ничему люди не учатся.
Ничему люди не учатся.
+6
Есть такие тонкости, но это не принципиальная вещь, которая бы делала coffeescript непригодным для реальных проектов.
Можно: использовать
использовать разную подсветку синтаксиса в редакторе для [..] и [...],
написать issue на трекер проекта или сделать pull request,
сделать свой fork на github
Эффект «упрощения и разработки более качественного кода» можно почувствовать только после начала самостоятельного использования coffeescript.
Можно: использовать
.slice 0, 10
вместо [0...10], использовать разную подсветку синтаксиса в редакторе для [..] и [...],
написать issue на трекер проекта или сделать pull request,
сделать свой fork на github
Эффект «упрощения и разработки более качественного кода» можно почувствовать только после начала самостоятельного использования coffeescript.
+1
Когда руби учил, тоже смущался. Но после 10 минут привыкаешь.
0
UFO just landed and posted this here
я в этом мире чего-то не понимаю, видимо. Для меня код на CoffeeScript не будет читабелен никогда.
-1
Если не писать на CoffeeScript, то очевидно он останется не читабельным, но нужно выходить из зоны комфорта, пробовать другие языки. Я не говорю, что нужно бежать и использовать CoffeeScript, но говорить, что он не читабелен, когда его многие используют и он для них удобен, — не профессионально.
+1
Первое впечатление: язык идеально подходит для того, чтобы кроме разработчика его не смог прочитать никто. Хотя насчёт того, что сам разработчик сможет это читать спустя эдак месяц, у меня сомнения.
Это новомодная защита от копирования или язык всё-таки? :)
Это новомодная защита от копирования или язык всё-таки? :)
0
Странно. Вот такой вот код генерится, если в цикле for используется переменная:
Andrey-Cherkashins-MacBook-Pro:~ andoriyu$ nano test.coffee
Andrey-Cherkashins-MacBook-Pro:~ andoriyu$ coffee -p test.coffee
(function() {
var i, n;
n = 2;
for (i = 0; 0
Andrey-Cherkashins-MacBook-Pro:~ andoriyu$ nano test.coffee
Andrey-Cherkashins-MacBook-Pro:~ andoriyu$ coffee -p test.coffee
(function() {
var i, n;
n = 2;
for (i = 0; 0
0
Вероятно, вы забыли разделитель между выражением и телом цикла. Покажите как вы его написали.
0
не вставилось: gist.github.com/2212226
0
Вообще честно сказать посмотрев в сторону CoffeeScript понял одно, что пока не готов его использовать. Пусть он упрощает кодирование и меньше кода получается, но вот то, что он выдает в файл .js мягко говоря, конфузит. Пока буду использовать синтаксис старого доброго JavaScript.
+1
Приведите пожалуйста пример того, что вас вводит в этот конфуз.
0
Далеко ходить не буду приведу простой примерчик
Содержимое CoffeeScript файла
Выходной javascript скрипт
А я всего лишь хотел чтобы было вот это:
Содержимое CoffeeScript файла
alert j for j in [1..5]
alert i for i in [0..2]
Выходной javascript скрипт
(function() {
var i, j, _i, _len, _ref;
for (i = 0; i <= 2; i++) {
_ref = [1, 2, 3, 4, 5](alert(i));
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
j = _ref[_i];
alert(j);
}
}
}).call(this);
А я всего лишь хотел чтобы было вот это:
for(j=1; j<=5; j++){
alert(j);
for(i=0; i<=2; i++){
alert(i);
}
}
0
Не знаю версию вашего компилятора, но интерактивная версия на сайте этот пример не откомпилила:
> PARSE ERROR ON LINE 2: UNEXPECTED 'INDENT'
> PARSE ERROR ON LINE 2: UNEXPECTED 'INDENT'
0
Оно то хоть работает?
0
for i in [1..5]
alert i
for i in [0..2]
alert i
На выходе:
var i;
for (i = 1; i <= 5; i++) {
alert(i);
for (i = 0; i <= 2; i++) {
alert(i);
}
}
+3
Во-первых Вы ошибку допустили в скрипте. У Вас два раза i используется переменная.
Во-вторых я не понимаю почему в офф документации используют именно этот вариант вызова alert
и почему он не работает кода вдруг ниже появляется подобная инструкция со сдвигом?
Во-вторых я не понимаю почему в офф документации используют именно этот вариант вызова alert
alert j for j in [1..5]
и почему он не работает кода вдруг ниже появляется подобная инструкция со сдвигом?
-1
Получается что я не могу доверять полностью CoffeeScript. Ибо мне нужно подразумевать, что некие инструкции могут восприниматься не так, как ты того ожидаешь.
+2
Постфиксная запись операторов пришла из Perl, по крайней мере он ее популяризовал. Coffee в этом плане ничего от себя не добавляет.
То, что вы пытаетесь одновременно использовать постфиксную и префиксную запись, не говорит о том, что язык плох, это говорит о том, что вы плохо изучили его возможности. Хотя, официальная документация по Coffeescript этот момент обходит и никаких замечаний не делает, наверное это не хорошо.
Возможно, при знакомстве с этими возможностями, следует обращать внимание на такие правила:
Если нужно писать код в одну строчку, используем либо постфиксную форму:
или префиксную с then
Заметьте, что код хорошо читается и похож на обычное предложение.
Если вам нужно написать несколько строк в «теле» оператора, либо одну, но длинную или тяжело читаемую, лучше воспользоваться префиксной формой с идентацией:
То, что вы пытаетесь одновременно использовать постфиксную и префиксную запись, не говорит о том, что язык плох, это говорит о том, что вы плохо изучили его возможности. Хотя, официальная документация по Coffeescript этот момент обходит и никаких замечаний не делает, наверное это не хорошо.
Возможно, при знакомстве с этими возможностями, следует обращать внимание на такие правила:
Если нужно писать код в одну строчку, используем либо постфиксную форму:
return if smth < 0
или префиксную с then
if smth < 0 then return
Заметьте, что код хорошо читается и похож на обычное предложение.
Если вам нужно написать несколько строк в «теле» оператора, либо одну, но длинную или тяжело читаемую, лучше воспользоваться префиксной формой с идентацией:
if smth < 0
smth = 0
foo = bar + 100500
return
+2
Потому что в этом случае используется списочное выражение, и вся логика находится в левой части. Поэтому нужен явный перевод строки. В статье есть пример:
0
Потому что в этом случае используется списочное выражение. Поэтому нужно явно использовать перевод строки.
0
Во первых coffeescript это почти такой же javascript, только без {/}/; т.е. вы можете писать на javascript синтаксом, напоминающим питон. Во вторых то, за что я люблю coffeescript — это классы, и наследование. В третьих обращаю ваше внимание что любое действие в coffeescript возвращает последний шаг, к примеру если вы напишете mydiv.onclick = -> alert(123) то в итоге этот код скомпилируется в mydiv.onclick = function() {return alert(123);}; Ну и в четвертых — онлайн компилятор (кнопка try coffeescript на coffeescript.org/ ) иногда помогает анализировать выходной код.
Написал в своё время на нём шахматы с использованием canvas. использовал coffee-script.js и type=«text/coffeescript». Так вот пока идёт трансляция и eval, проходит около минуты и в это время браузер просто виснет намертво. Отсюда следует что большой код лучше компилировать в js, а не пользоваться инлайн-ретранслятором
Написал в своё время на нём шахматы с использованием canvas. использовал coffee-script.js и type=«text/coffeescript». Так вот пока идёт трансляция и eval, проходит около минуты и в это время браузер просто виснет намертво. Отсюда следует что большой код лучше компилировать в js, а не пользоваться инлайн-ретранслятором
+2
Во-вторых то, за что я люблю coffeescript — это классы, и наследованиеВы так говорите, как будто в JS нет классов и наследования.
0
Наоборот, в жаваскрипте очень много классов и наследования. Штук пять несовместимых реализаций.
0
UFO just landed and posted this here
К сожалению с обратной совместимость не все так гладко, особенно когда речь идет о классическом способе создания объектов.
На эту тему в ближайшее время постараюсь написать отдельную статью.
На эту тему в ближайшее время постараюсь написать отдельную статью.
0
Спасибо! Хоть уже и использую пару месяцев coffeescript в одном своем проекте, но операция do до сих пор из-под моего внимаения ускользала. А вот сейчас взял и поменял пару мест у себя в коде, где эта операция пришлась ну очень кстати!
Эх, если бы был еще вариент этой операции, который посволял такие вот случаи обрабатывать:
было бы вообще клево
Эх, если бы был еще вариент этой операции, который посволял такие вот случаи обрабатывать:
(function(x) {
})(arr.x)
было бы вообще клево
+1
((x) ->)(arr.x)
0
У меня сейчас так и делается.
Просто do — весьма изящный способ избавиться от лишних скобок
Просто do — весьма изящный способ избавиться от лишних скобок
0
do (x = arr.x) ->
0
CoffeScript по отношению к JS — это как Visual Basic по отношению к C#. Вроде больше слов, проще конструкции, весь язык такой… литературный. Но от обилия этого сахара видеть логику кода становится только сложнее.
+1
Просто к ЖСу уже замыелн глаз и читая код ты не читаешь каждое слово или символ. Мозг уже сходу видит знакомые конструкции и куски кода и хватает тело цикло, а не его описание и т.д. А смотря новый код ты пыатешь прочитать абсолютно все и осмыслить, что затрудняет восприятие его няшности. В 1 проекте сейчас пишу на кофе, смысла использовать чистый жс в новых проектах больше не вижу :)
0
Для меня очень полезный пост, так как сам недавно начал использовать CoffeeScript, но примеры в одну строчку вроде:
(if value is 1 then alert "#{key}: #{value}") for key, value of document
мне кажется, могут отбить желание у новичков использовать прекрасный синтаксис CoffeeScript
(if value is 1 then alert "#{key}: #{value}") for key, value of document
мне кажется, могут отбить желание у новичков использовать прекрасный синтаксис CoffeeScript
+1
К примеру инструкция for...of, сейчас носит более общий характер нежели это нужно:
[value for key, value of [1,2,3]]
На выходе мы получим следующее извращенство:
var key, value; alert([
Вот тут немного непонятно, откуда alert спарсился.
0
Добавил раздел про вложенные инструкции!
0
Эм, за напоминание о слайсах — спасибо, в отместку — там опечатка есть
Не, чтобы получить плоский список надо сказать
[list1, list2 ...] #[1,2,3,4,5,6]
Не, чтобы получить плоский список надо сказать
[list1..., list2...]
0
Алсо — с места
и до конца раздела — это вы о чем?
Во-первых не нужно писать of [arr], нужно in [arr]
Во вторых — смысла конструкции вообще не понял — может проще сразу было
не?
[value for i, value of ['a', 'b', 'c'][0...2]] # a, b
и до конца раздела — это вы о чем?
Во-первых не нужно писать of [arr], нужно in [arr]
Во вторых — смысла конструкции вообще не понял — может проще сразу было
['a', 'b', 'c'][0...2]
не?
0
Спасибо что обратили на это внимание, должно быть так:
В данном случае, для получение значений массива использовать нужно именно of, а не in.
Суть примеров — показать возможности синтаксических конструкций, а не их эффективности
foo = (value for i, value of ['a', 'b', 'c'][0...2])
Во-первых не нужно писать of [arr], нужно in [arr]
В данном случае, для получение значений массива использовать нужно именно of, а не in.
Во вторых — смысла конструкции вообще не понял — может проще сразу было
Суть примеров — показать возможности синтаксических конструкций, а не их эффективности
0
В данном случае, для получение значений массива использовать нужно именно of, а не in.
ой ли?
вот две записи, дающие одинаковый результат
result_in = ( val for val in ['a', 'b', 'c'][0...2])
result_of = ( val for key, val of ['a', 'b', 'c'][0...2])
Но почему первая — корректна, а вторая — путь на темную сторону?
Потому что:
var key, result_in, result_of, val;
result_in = (function() {
var _i, _len, _ref, _results;
_ref = ['a', 'b', 'c'].slice(0, 2);
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
val = _ref[_i];
_results.push(val);
}
return _results;
})();
result_of = (function() {
var _ref, _results;
_ref = ['a', 'b', 'c'].slice(0, 2);
_results = [];
for (key in _ref) {
val = _ref[key];
_results.push(val);
}
return _results;
})();
Мы же не будем спорить о том, насколько неэффективно обращаться с массивом как объектом?
0
Алсо —
ИМХО удачнее будет
alert i for i in [1..10] when i % 2 is 0
ИМХО удачнее будет
for i in [1..10] when not( i % 2) then console.log i
0
Алсо —
пример явно не удачный, потому как это же явно
expr = /foo*/g;
alert "#{array[0]} : #{expr.lastIndex}" until (array = expr.exec('foofoo')) is null
пример явно не удачный, потому как это же явно
expr = /foo/g
console.log "#{array[0]} : #{expr.lastIndex}" while array = expr.exec 'foofoo'
0
Sign up to leave a comment.
CoffeeScript: Подробное руководство по циклам