Длина строки в препроцессоре M4

Таким образом, с помощью этого простого ввода

define(foo, len($1)) foo(abcdef)

Я получаю в качестве вывода:

 2

Как я могу заставить это напечатать 5 вместо этого? Я не могу придумать какую-либо комбинацию кавычек, которая заставляет len() фактически получать значение $1, abcdef вместо буквальной строки `$1'.

Редактировать 1. Фактически рассматриваемый код выглядит примерно так:

define(`FILE', `#' /!\ $1 /!\
`#' ====substr(==============================,0,len($1))====)dnl
FILE(`UTILITY.ASM')

person ELLIOTTCABLE    schedule 22.06.2016    source источник
comment
Я не вижу, какое это имеет отношение к [c], его [c-препроцессору] или [препроцессору] в целом (m4 — макроязык/макропроцессор общего назначения). Обновите свой вопрос, чтобы показать, как он связан с этими тегами, или удалить эти теги.   -  person John Bollinger    schedule 22.06.2016
comment
M4 обычно предлагается (часто на SO!) в качестве замены для людей, пытающихся делать сложные вещи с CPP. Я оставляю теги, так как с прагматической точки зрения кажется, что любой вопрос M4 является расширением вопроса CPP; но я не обижусь, если кто-то захочет их удалить. ¯\_(ツ)_/¯   -  person ELLIOTTCABLE    schedule 22.06.2016


Ответы (1)


Занижение кавычек len($1) приводит к его немедленной оценке на этапе определения, поэтому foo определяется как 2.

т.е. это эквивалентно:

define(foo, 2) foo(abcdef)

При полном цитировании результаты будут такими, как вы ожидаете:

define(`foo', `len($1)') foo(`abcdef')
> 6
person lossleader    schedule 22.06.2016