Value eval(Value arg, Table env) { if (arg.tag == ConsCell) { Value operator = car(arg); Value operands = cdr(arg); // <- debugger stopped here Si imprimo el argumento arg con p arg , obtengo:
(lldb) p arg (Value) $0 = { data = { number = 1068272 list = 0x0000000100104cf0 symbol = 0x0000000100104cf0 "?L\x10" } tag = ConsCell } Pero si p operator , obtengo:
(lldb) p operator error: expected a type error: 1 errors parsing expression Sin embargo, usar frame variable operator funciona:
(lldb) frame variable operator (Value) operator = { data = { number = 1068208 list = 0x0000000100104cb0 symbol = 0x0000000100104cb0 "\x10L\x10" } tag = ConsCell } ¿Qué va mal cuando uso el p operator ?
lldb evalúa la expresión en un híbrido de C++ y Objective-C. operator , el nombre de su variable, es una palabra clave reservada en C++. Cuando usa el comando p (que es un alias para el comando de expression ), lldb pasa su expresión a clang para analizar y evaluar en C++/Objective-C (o, si está depurando un método Swift, analizar y evaluar en Swift) . Aunque su programa está escrito en C puro, sus expresiones se evalúan como expresiones de C++ y esa no es una expresión de C++ válida.
frame variable ( fr v para abreviar) no pasa por un compilador para su evaluación, intenta realizar un análisis simple de la ruta de la variable provista. Puede hacer una simple desreferenciación y seguimiento de punteros, pero no puede emitir valores, por ejemplo.