Changeset 13023


Ignore:
Timestamp:
Oct 15, 2009, 5:13:15 AM (10 years ago)
Author:
greg
Message:

Now you can write (setf (#/objectForKey: dict key) val) instead of (#/setObject:forKey: dict val key) for any #/set... message.

Location:
trunk/source/objc-bridge
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/objc-bridge/objc-runtime.lisp

    r12843 r13023  
    25502550    (apply (objc-message-info-lisp-name info) instance args)))
    25512551                   
     2552(defun objc-set->setf (method)
     2553  (let* ((info (get-objc-message-info method))
     2554         (name (objc-message-info-lisp-name info))
     2555         (str (symbol-name name))
     2556         (value-placeholder-index (position #\: str)))
     2557    (when (and (> (length str) 3) value-placeholder-index)
     2558      (let* ((truncated-name (nstring-downcase (subseq (remove #\: str
     2559                                                               :test #'char= :count 1)
     2560                                                       3)
     2561                                               :end 1))
     2562             (reader-name (if (> (length truncated-name)
     2563                                 (decf value-placeholder-index 3))
     2564                            (nstring-upcase truncated-name
     2565                                           :start value-placeholder-index
     2566                                           :end (1+ value-placeholder-index))
     2567                            truncated-name))
     2568             (reader (intern reader-name :nextstep-functions)))
     2569        (eval `(defun (setf ,reader) (value object &rest args)
     2570                 (apply #',name object value args)
     2571                 value))))))
     2572
     2573(defun register-objc-set-messages ()
     2574  (do-interface-dirs (d)
     2575    (dolist (init (cdb-enumerate-keys (db-objc-methods d)
     2576                                      #'(lambda (string)
     2577                                          (string= string "set"
     2578                                                   :end1 (min (length string) 3)))))
     2579      (objc-set->setf init))))
    25522580
    25532581 
     
    27482776          :imp imp
    27492777          :class-p class-p)))
     2778  (if (string= selname "set" :end1 (min (length selname) 3))
     2779    (objc-set->setf selname))
    27502780  impname)
    27512781   
  • trunk/source/objc-bridge/objc-support.lisp

    r12659 r13023  
    107107(maybe-map-objc-classes t)
    108108(register-objc-init-messages)
     109(register-objc-set-messages)
    109110
    110111#+gnu-objc
     
    552553                        (map-objc-classes)
    553554                        ;; Update info about init messages.
    554                         (register-objc-init-messages))
     555                        (register-objc-init-messages)
     556                        (register-objc-set-messages))
    555557                      (return winning)))))))))))
    556558
Note: See TracChangeset for help on using the changeset viewer.