From 39df905ad0ca7fe6bc4e893fb0a2d793f45a9ab8 Mon Sep 17 00:00:00 2001 From: Matthias Benkard Date: Sat, 4 Aug 2007 18:50:14 +0200 Subject: Properly document INVOKE and INVOKE-BY-NAME. darcs-hash:f0d069d3c295135cad49752aeb05f96cefd9a753 --- Lisp/libobjcl.lisp | 4 ++- Lisp/method-invocation.lisp | 88 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 3 deletions(-) (limited to 'Lisp') diff --git a/Lisp/libobjcl.lisp b/Lisp/libobjcl.lisp index 6f3b52a..bf246be 100644 --- a/Lisp/libobjcl.lisp +++ b/Lisp/libobjcl.lisp @@ -73,15 +73,17 @@ converted into a string according to the following rules: 2. Any additional components have all of their letters converted to lower case, except for their first letters, which are left intact. -After this, the components are concatenated in order and the resulting +After that, the components are concatenated in order and the resulting string used as if directly given as an argument to FIND-OBJC-CLASS. + Examples: (find-objc-class \"NSObject\") ;=> # (find-objc-class 'ns-object) ;=> # (find-objc-class 'nsobject) ;=> NIL + Rationale: The first component of an Objective C class name is conventionally diff --git a/Lisp/method-invocation.lisp b/Lisp/method-invocation.lisp index c7e8810..252426f 100644 --- a/Lisp/method-invocation.lisp +++ b/Lisp/method-invocation.lisp @@ -3,7 +3,62 @@ ;;; (@* "Method invocation") (defun invoke (receiver message-start &rest message-components) - "FIXME" + "Send a message to an Objective C instance. + +RECEIVER: an Objective C wrapper object. + +MESSAGE-START: a symbol. + +MESSAGE-COMPONENTS: an alternating list of arguments and message name +component symbols. + +Returns: the return value of the method invocation. + + +Each message name component is first split into parts seperated by +hyphens and each part is converted into a string according to the +following rules: + + 1. The first part is fully converted to lower case. + + 2. Any additional parts are also fully converted to lower case except + for their first letters, which are left intact. + + 3. If the symbol is a keyword symbol, the resulting string is suffixed + by a colon (`:'). + +After that, all parts are concatenated in order to form a single message +component. The message components are in turn concatenated in order to +form the message name which is used as if the second argument to a call +to INVOKE-BY-NAME. + +The message components that are not message name components are +collected in order and the resulting list used as if as additional +arguments to INVOKE-BY-NAME. + + +Examples: + + (invoke (find-objc-class 'ns-string) + :string-with-c-string \"Mulk.\") + ;=> # + + (invoke (find-objc-class 'ns-object) + 'self) + ;=> # + + (invoke (find-objc-class 'ns-object) + 'name) + ;=> \"NSObject\" + + (invoke (find-objc-class 'ns-string) + :string-with-c-string \"Mulk.\" + :encoding 4) + ;=> # + + +See also: INVOKE-BY-NAME" + (flet ((message-component->string (symbol) (let* ((components (split-sequence #\- (symbol-name symbol) :remove-empty-subseqs t)) @@ -36,7 +91,36 @@ (defun invoke-by-name (receiver method-name &rest args) - "FIXME" + "Send a message to an Objective C object by the name of the method. + +RECEIVER: an Objective C wrapper object. + +METHOD-NAME: a string. + +ARGS: a list of objects. + +Returns: the return value of the method invocation. + + +Examples: + + (invoke-by-name (find-objc-class 'ns-string) + \"stringWithCString:\" \"Mulk.\") + ;=> # + + (invoke-by-name (find-objc-class 'ns-object) + \"self\") + ;=> # + + (invoke-by-name (find-objc-class 'ns-string) + \"stringWithCString:encoding:\" + \"Mulk.\" + 4) + ;=> # + + +See also: INVOKE" + (let* ((arglist (arglist-intersperse-types (mapcar #'lisp->obj-data args))) (return-value (apply-macro '%objcl-invoke-class-method -- cgit v1.2.3