M4 eval точность - PullRequest
       16

M4 eval точность

2 голосов
/ 26 марта 2011

Я пытаюсь использовать макросы M4 для генерации CSS-файлов.Я хочу ввести свои значения в px и выполнить простую математическую процедуру, используя eval (), чтобы получить результаты в em.К сожалению, я не нашел, как получить поплавки.

define(`FONTSIZE', `13')dnl
define(`LINEHEIGHT', `17')dnl
.content {padding : eval(LINEHEIGHT / FONTSIZE)em}
>>> m4 style.css.m4
>>> .content {padding : 1em}

Есть идеи?

Спасибо!

Ответы [ 2 ]

1 голос
/ 26 марта 2011

Для вашей конкретной цели выражение может выглядеть примерно так:

eval(LINEHEIGHT/FONTSIZE).substr(eval(((LINEHEIGHT%FONTSIZE)*1000)/FONTSIZE + 1000),1)

(конечно, используйте степень 10, соответствующую вашим требованиям к точности). Это обычный прием для получения результата с плавающей запятой.из подразделения.Другие операторы являются более сложными, не говоря уже о таких функциях, как sin, cos, ln ...

В принципе, было бы в принципе возможно написать некоторые макросы с плавающей запятой, реализованные с помощью строковых операций и целочисленных операторов,Я думаю, что более практично использовать внешнюю программу (bc, gawk ...), вызываемую syscmd (), когда операции не так просты, как деление.

0 голосов
/ 16 июня 2014

Вдохновленный предыдущим ответом:

define(`FONTSIZE', `13')dnl
define(`LINEHEIGHT', `17')dnl

.content {padding:syscmd(bc <<< "scale=6; print LINEHEIGHT/FONTSIZE")em;}

Примечание: scale=6; для плавающей точности

NB. Я написал для этого небольшой макрос, вы можете найти его здесь: Макрос препроцессора m4 BC

...