Re: Pregunta sobre el tipo () de la variable declarada con expr ()Lo principal a tener en cuenta es que Imprimir() , Escribe() y Show() tratan sus argumentos de manera un poco diferente a la mayoría de las funciones: desempaquetan pero no evalúan. Por lo tanto Imprimir ( c ) imprimirá lo que C es -- es una expresión. Tipo() desempaquetará, luego evaluará su argumento y luego devolverá su tipo. Si quieres Tipo() comportarse más como Imprimir() , luego usa Nombre Expr() , como Tipo( Nombre Expr( c ) )
Re: Pregunta sobre el tipo () de la variable declarada con expr ()Gracias @ErraticAdjuntar
Entiendo claramente lo que estás explicando.
Sin embargo, tengo una pregunta para ti.
Si Tipo () se desempaqueta y evalúa, luego exp. (a + b) se evalúa en el caso 4, ¿no debería devolverse Número como el valor de retorno de Tipo () como en el caso 3?En el proceso de evaluación del tipo después del desempaquetado, ¿el procesamiento difiere dependiendo de si el argumento se especifica como una variable o como una función?
Re: Pregunta sobre el tipo () de la variable declarada con expr ()Los lenguajes como C y C++ evalúan los argumentos de las llamadas a funciones antes de la llamada. C y C++ no tienen un tipo de datos de expresión porque las expresiones se compilan en código en el momento de la compilación. Ejecución más rápida, pero limita algunas de las formas en que puede pensar en resolver un problema.
JSL tiene una función parse() que toma una cadena y la convierte en un árbol de expresión. La función eval() evalúa el árbol. El árbol se evalúa automáticamente cuando se accede a él como el lado derecho de una tarea, a menos que se tenga especial cuidado de echarle un vistazo.Hay una función nameExpr() que solo debe usarse si necesita echar un vistazo a la expresión almacenada en una variable sin evaluarla accidentalmente. Por alguna razón, perdido en el tiempo, y tal vez demasiado tarde para arreglarlo ahora, print/show/write se escribieron sin la llamada para evaluar sus argumentos si el argumento parece ser una variable simple. Ok, en ese momento probablemente pareció una aceleración porque hay algunos gastos generales para eval (c) frente a solo obtener el valor de c. Pero print(c+0) evaluará el argumento, al igual que print(eval(c)), porque el argumento no es una variable simple.
Re: Pregunta sobre el tipo () de la variable declarada con expr ()@Craige_Hales ciertamente es correcto: desempacar no es un buen término, ¡perdón por cualquier confusión!Sin embargo, el comportamiento que estaba tratando de describir está documentado: consulte este enlace: https://www.jmp.com/support/help/en/15.2/index.shtml#page/jmp/expresiones.shtml
Aquí está el bit relevante:

Re: Pregunta sobre el tipo () de la variable declarada con expr ()¡¡GRACIAS!! usted ha sido de gran ayuda! 
Re: Pregunta sobre el tipo () de la variable declarada con expr ()¡Gracias! Se volvió muy útil.
Re: Pregunta sobre el tipo () de la variable declarada con expr ()a = 1;
b = 2;
type( a + b );
"Número"
Internamente, type recibió un árbol de expresión que se parece a add( a, b ). El árbol se evalúa a un número.
a = 1;
b = 2;
type( expr( a + b ) );
"Expresión"
Internamente, type recibió un árbol de expresión que se parece a expr( add( a, b ) ). De nuevo, se evalúa el árbol; el nodo expr() en el árbol devuelve su argumento como una expresión.
a = 1;
b = 2;
c = expr( a + b );
type( c );
"Número"
Internamente, el tipo recibió un árbol de expresión que se parece a c. De nuevo, se evalúa. c es una expresión, add(a,b), que usará los valores actuales de a y b siempre que se evalúe c.c NO tiene un nodo expr() en su árbol.
"desempaquetar" no es una idea bien definida en JSL. Cada función incorporada inicialmente ve sus argumentos como árboles de expresión. Algunas funciones evalúan sus argumentos sin mirarlos primero. Otras funciones nunca las evalúan. Algunas funciones buscan si el nodo raíz de la expresión es eval() o expr() o send() y hacen algo diferente. (enviar() es el operador <<. Hay un uso único en las listas de argumentos para identificar argumentos especiales, a menudo se envían mensajes reales a un cuadro de visualización que se está creando). Agregar una expresión de fórmula a una columna es un ejemplo que a veces me hace tropezar; asume que el argumento no debe ser evaluado. Agregar eval() alrededor de la fórmula hace que se eval, porque formula(...) mira el argumento. La alternativa habría sido evaluar siempre el argumento y luego el caso de uso normal requeriría expr() alrededor de la fórmula (porque evaluar expr(...) simplemente devuelve su argumento).
Pregunta sobre el tipo () de la variable declarada con expr ()Hola
Estoy usando 'expr()' y tengo algunas preguntas.
Haré preguntas según el número escrito en los comentarios.
1) ¿Se puede considerar que eval() se aplica cuando c se ejecuta tal cual?
2) -
3) ¿Por qué aparece Number cuando se marca el tipo de variable c declarada como expr()?
Si type() ejecuta el argumento, reconoce el tipo y muestra el resultado, me pregunto por qué es Expression en el caso de 4).
4) -
a = 1;
b = 2;
c = expr(a + b);
c; // 1) Result : 3
print(c); // 2) Result : a + b
type(c); // 3) Result : Number
type(expr(a + b)); // 4) Result : Expression
Gracias 
Ingeniería de Calidad y ProcesosRe: Pregunta sobre el tipo de variable declarada con expr()Es interesante ver que la escritura hace cosas diferentes dependiendo del tipo de argumento.
Hay otras funciones que hacen lo inverso: buscan un nombre simple, pero NO evalúan una expresión más compleja.
¿Alguien tiene una lista completa de qué función "busca", "descomprime", "evalúa" ... su argumento antes de usarlo ?
¿Cuántos casos hay que considerar?
Noté que hay algunos casos especiales como for each , que verifica si el primer argumento es una lista.
x= Expr(Print(2));
y = "hello";
Write(x); // ->Print(2)
Write(y || " world"); // hello world
Head(x); // Print()
Type(x); //-> 2
...