#include <llambda.hpp>
Inheritance diagram for LExpressionMacro:
InteLib models the Common Lisp's flavor of macros. They aren't really macros though because they're always expanded at the execution time, so they perhaps should be terribly slow. Actually, the LExpressionMacro is a kind of special form which, like a Lambda, has a lambda list, a body and acts as a closure (remembering all the lexical bindings that were in effect on the moment the macro has been created). A call to such a macro evaluates as follows:
Definition at line 119 of file llambda.hpp.
Public Member Functions | |
LExpressionMacro (const LContextRef &a_cont, const SReference &lambda, const SReference &body) | |
The constructor. | |
virtual void | Call (const SReference &formtail, IntelibContinuation &cont) const |
Perform macro expansion and evaluate the result. | |
virtual SString | TextRepresentation () const |
Text representation of the S-expression. | |
const IntelibTypeId & | TermType () const |
Actual S-expression type. | |
bool | IsChangeable () const |
Can it be changed during the lifetime of the object? | |
virtual SExpression * | Clone () const |
Clone a changeable object. | |
virtual bool | SpecificEql (const SExpression *) const |
Are the two objects EQL (while not EQ). | |
SReference & | GetBody () |
Get the body. | |
Static Public Attributes | |
static IntelibTypeId | TypeId |
The type identifier. | |
Protected Member Functions | |
virtual | ~LExpressionMacro () |
bool | CanDie () |
Is it OK to delete the object now? | |
void | DoAnalyseLambdaList (const SReference &rest, int n) |
Protected Attributes | |
LContextRef | context |
SReference | lambda_list |
LExpressionSymbol ** | lambda_vector |
LExpressionSymbol * | lambda_rest |
int | lambda_length |
SReference | body |
|
The constructor.
Definition at line 133 of file llambda.cpp. |
|
Definition at line 139 of file llambda.cpp. |
|
Perform macro expansion and evaluate the result. This method actually does all the job; however, you generally won't need to do so; better construct the appropriate form and LReference::Evaluate() it. This is because the expansion and evaluation is actually only scheduled to be done within the given continuation, and you'll need yourself to make the continuation run to get the result of the application. Implements SExpressionForm. Definition at line 142 of file llambda.cpp. References SReference::Car(), SReference::Cdr(), and SReference::IsEmptyList(). |
|
Text representation of the S-expression. Returns the text string which represents the given S-expression as for real Lisp (for example, (25 36 49)) Implements SExpression. Definition at line 168 of file llambda.cpp. |
|
Actual S-expression type.
Definition at line 195 of file sexpress.hpp. Referenced by SReference::DynamicCastGetPtr(), SchReference::IsEql(), LReference::IsEql(), SReference::SimpleCastGetPtr(), SchReference::TextRepresentation(), and LReference::TextRepresentation(). |
|
Can it be changed during the lifetime of the object?
Definition at line 198 of file sexpress.hpp. References IntelibTypeId::IsChangeable(). |
|
Clone a changeable object. The method should return the pointer created with new
Reimplemented in SExpressionBacklink, SExpressionCons, SExpressionHashTable, SExpressionRawBuffer, and SExpressionVector. Definition at line 214 of file sexpress.hpp. |
|
Are the two objects EQL (while not EQ). This function is overriden by those SExpressions able to be EQL while being not EQ.
Reimplemented in SExpressionInt, SExpressionFloat, SExpressionChar, and SExpressionString. Definition at line 235 of file sexpress.hpp. Referenced by SchReference::IsEql(), and LReference::IsEql(). |
|
Is it OK to delete the object now? Our children have no access to the private attribute RefCount and should never need it except when checking if the destruction is not an error. This solves the problem. Definition at line 53 of file refcount.hpp. |
|
Definition at line 36 of file llambda.cpp. References SExpressionCons::Car(), SExpressionCons::Cdr(), SReference::DynamicCastGetPtr(), SReference::GetPtr(), INTELIB_ASSERT, LispLambdaBody::lambda_length, LispLambdaBody::lambda_rest, and LispLambdaBody::lambda_vector. Referenced by LispLambdaBody::LispLambdaBody(). |
|
Get the body.
Definition at line 56 of file llambda.hpp. References LispLambdaBody::body. |
|
The type identifier.
Reimplemented from SExpressionForm. |
|
Definition at line 41 of file llambda.hpp. |
|
Definition at line 42 of file llambda.hpp. |
|
Definition at line 43 of file llambda.hpp. Referenced by LispLambdaBody::DoAnalyseLambdaList(), and LispLambdaBody::~LispLambdaBody(). |
|
Definition at line 44 of file llambda.hpp. Referenced by LispLambdaBody::DoAnalyseLambdaList(). |
|
Definition at line 45 of file llambda.hpp. Referenced by LispLambdaBody::DoAnalyseLambdaList(). |
|
Definition at line 46 of file llambda.hpp. Referenced by LispLambdaBody::GetBody(). |