> 1 <

Автор Сообщение

alexandr

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#827   2009-12-23 05:04 GMT+3 часа(ов)      
Не подскажете, где можно найти коды функций get, putprop и remprop? Или сами напишите, я думаю, вам, как людям, программирующим на Лиспе, это будет несложно, не то что мне. Мне нужно, чтобы эти функции были реализованы через простейшие, типа car, cdr, cond, cons и т.д. Ну что-то типа этого:

(defun union (X Y)
(cond
((NULL X) Y)
((member (car X) Y) (union (CDR X) Y) )
(T (cons (CAR X) (union (CDR X) Y)))
))

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#828   2009-12-23 05:18 GMT+3 часа(ов)      
их невозможно реализовать через car, cdr...

т.к. они имеют доступ к полю "свойств" у символов. их можно реализовать предполагая наличие хотябы таких примитивов:
symbol-plist symbol => plist
(setf (symbol-plist symbol) new-plist)

alexandr

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#829   2009-12-23 05:49 GMT+3 часа(ов)      
Ну если можно так - давайте так!

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#832   2009-12-23 06:16 GMT+3 часа(ов)      
из исходников CMUCL:

defun get (symbol indicator &optional (default nil))
"Look on the property list of SYMBOL for the specified INDICATOR. If this
is found, return the associated value, else return DEFAULT."
(do ((pl (symbol-plist symbol) (cddr pl)))
((atom pl) default)
(cond ((atom (cdr pl))
(error "~S has an odd number of items in its property list."
symbol))
((eq (car pl) indicator)
(return (cadr pl))))))

(defun %put (symbol indicator value)
"The VALUE is added as a property of SYMBOL under the specified INDICATOR.
Returns VALUE."
(do ((pl (symbol-plist symbol) (cddr pl)))
((endp pl)
(setf (symbol-plist symbol)
(list* indicator value (symbol-plist symbol)))
value)
(cond ((endp (cdr pl))
(error "~S has an odd number of items in its property list."
symbol))
((eq (car pl) indicator)
(rplaca (cdr pl) value)
(return value)))))

(defun remprop (symbol indicator)
"Look on property list of SYMBOL for property with specified
INDICATOR. If found, splice this indicator and its value out of
the plist, and return the tail of the original list starting with
INDICATOR. If not found, return () with no side effects.

NOTE: The ANSI specification requires REMPROP to return true (not false)
or false (the symbol NIL). Portable code should not rely on any other value."
(do ((pl (symbol-plist symbol) (cddr pl))
(prev nil pl))
((atom pl) nil)
(cond ((atom (cdr pl))
(error "~S has an odd number of items in its property list."
symbol))
((eq (car pl) indicator)
(cond (prev (rplacd (cdr prev) (cddr pl)))
(t
(setf (symbol-plist symbol) (cddr pl))))
(return pl)))))

alexandr

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#855   2009-12-24 01:07 GMT+3 часа(ов)      
Спасибо огромное!
> 1 <


Онлайн :

0 пользователь(ей), 28 гость(ей) :




Реклама на сайте: