Как определить удобный синтаксис единицы измерения в CoffeeScript?

В этом примере использования Groovy автор описывает, как можно использовать Уловки Groovy для определения синтаксиса для единиц измерения, такие, что вы можете написать, например,

3.cm + 12.m * 3 - 1.km

и заставить его работать, как ожидалось. Есть ли способ определить столь же умный синтаксис для связывания единиц измерения с числами в CoffeeScript? (Я очень новичок в CoffeeScript; извините, если это уже решено или есть очевидный ответ.)


person mhucka    schedule 20.09.2012    source источник


Ответы (3)


Я думаю, что ответ BasicWolf является наиболее идиоматичным, поскольку вы можете иметь эти функции в своем собственном модуле и импортировать их только тогда, когда вы хотите использовать их, не загрязняя глобальное пространство имен или встроенные объекты JS.

В Groovy вы можете использовать Категорию, чтобы не засорять встроенные классы дополнительными элементами. методы.

Но если вам не нужно добавлять что-либо к встроенным объектам, вы можете пойти дальше и использовать Object.defineProperties, чтобы сделать синтаксис точно таким же, как в примере Groovy :)

Object.defineProperties Number.prototype,
  km: {get: -> @ * 1000}
  m:  {get: -> @}
  cm: {get: -> @ * 0.01}

console.log 3.cm + 12.m * 3 - 1.km # -> -963.97
person epidemian    schedule 20.09.2012

Я бы не рекомендовал это, но это работает:

Number::cm = ->
  this / 100

Number::m = ->
  this

Number::km = ->
  this * 1000


3.cm() + 12.m() * 3 - 1.km() # evaluates to -963.97

Вы не можете избавиться от круглых скобок, потому что 3.cm ссылается на функцию cm, а не вызывает ее.

person Christoph Leiter    schedule 20.09.2012

К сожалению, это невозможно сделать с помощью CoffeeScript. Что вы можете сделать, это что-то вроде (как в CoffeeScript, так и в JavaScript):

cm(3) + m(12) * 3 - km(1)

Здесь cm(), m(), km() — это функции, которые преобразуют значения, например, в метров. В терминах CoffeeScript следующее выражение

(cm 3) + 3 * (m 12) - (km 1)

также действует.

person Zaur Nasibov    schedule 20.09.2012
comment
Последний фрагмент не правильный. Он компилируется в: cm(3 + 3 * m(12 - km(1))). Вы можете использовать (cm 3) + (m 3) * 3 - (km 1), который IMO больше соответствует девизу избегать круглых скобок :) - person epidemian; 20.09.2012
comment
Спасибо за исправление. Лично я всегда использую скобки :) - person Zaur Nasibov; 20.09.2012
comment
Ага. Скобки в CoffeeScript — горячая тема: P - person epidemian; 20.09.2012