Действительно начинается... конец, в то время как обозначают 'блок'?

где определение макроса может иметь несколько значений

Макрос не имеет значений. Макрос - это конструкция манипуляции токеном. Когда препроцессор расширяет его, он превращает (ноль или более) входных токенов в выходные токены. Выходные токены просто должны быть действительными токенами, они даже не должны быть действительным кодом Си. Например:

#define foo(t) 1 > 0 t 0 : 1

Это совершенно правильное функциональное определение макроса. Когда мы пишем foo(;) или foo(3), препроцессор подставляет аргумент в последовательность токенов, которую он выплевывает. Конечно, для аргументов, которые мы предоставили, результат синтаксически неверен C. Но foo(?) приведет к действительному C.

Смысл этой преамбулы состоял в том, чтобы объяснить, что эти точки с запятой не делают ничего особенного. Они являются лишь частью последовательности токенов, которую выкладывает макрос. Этот макрос предназначен для замены себя последовательностью объявлений и определений функций, которые реализуют системный вызов. Объявления и операторы в органах функций должны заканчиваться символом ;. Ничего больше.

11
задан niton 18 April 2015 в 14:11
поделиться

2 ответа

Блок имеет особое значение в Ruby. Согласно Matz, создателю Ruby, можно посмотреть на блок как на неназванную функцию - обычно что-то, что может быть yieldредактор в, и который может также взять параметры.

Можно видеть следующий вид disamiguation при описании синтаксиса Ruby:

  • begin...end (что называют, блок на других языках) может иногда упоминаться просто как, что это, т.е. выражение (который может в свою очередь содержать другие выражения - выражение - просто что-то, что имеет возвращаемое значение) в Ruby. Некоторые ссылки все еще назовут это a begin/end block, или a code block, добавление несколько к беспорядку
  • do...end или {...} будет всегда упоминаться как блок в Ruby

Для примеров просмотрите страницу справочника синтаксиса Ruby, например.

begin expression end
expression while expression
loop block

Для дополнительных материалов для чтения см.:

19
ответ дан 3 December 2019 в 03:19
поделиться

begin/end строго поток управления, не блоки.

begin
  puts "hi"
end
# => "hi"

Код сразу работает. Если бы это был блок, то это имело бы к названный так или иначе для кода в нем для выполнения, как в этом примере:

def a_method; end
a_method { puts "hi" }
# nothing..

def a_method
  yield
end

a_method { puts "Hi!" }
# => "Hi!"
9
ответ дан 3 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: