fork download
  1. #lang racket
  2.  
  3. (require (only-in srfi/1 alist-cons alist-delete))
  4. (provide *p-list* keyword-get putprop! remprop! symbol-plist)
  5.  
  6. (define *p-list* '())
  7.  
  8. (define (symbol-plist sym)
  9. (cond ((assq sym *p-list*) => (lambda (x)
  10. (cdr x)))
  11. (else null)))
  12.  
  13. (define keyword-get
  14. (case-lambda
  15. ((args kw not-found)
  16. (cond ((memq kw (symbol-plist args))
  17. => (lambda (x)
  18. (cadr x)))
  19. (else not-found)))
  20. ((args kw) (keyword-get args kw #f))))
  21.  
  22. (define (remprop! sym indicator)
  23. (and (keyword-get sym indicator)
  24. (let-values (((head tail)
  25. (let ((lst (symbol-plist sym)))
  26. (split-at lst (index-of lst indicator eq?)))))
  27. (let ((datum (append head (cddr tail))))
  28. (set! *p-list* (alist-cons sym datum
  29. (alist-delete sym *p-list*)))
  30. #t))))
  31.  
  32. (define (putprop! atom val property p-list)
  33. (when (keyword-get atom property)
  34. (remprop! atom property))
  35. (let ((datum (append `(,property ,val) (symbol-plist atom))))
  36. (set! *p-list* (alist-cons atom datum
  37. (alist-delete atom *p-list*)))
  38. val))
Success #stdin #stdout 0.85s 71844KB
stdin
(putprop! 'Mary 28 '#:age)
(putprop! 'Mary 'female '#:sex)
(putprop! 'Mary '(Bill Susan Alice) '#:children)
(putprop! 'Mary 'lawyer '#:occupation)
(printf "~a~%" (keyword-get 'Mary '#:age))
(printf "~a~%" (keyword-get 'Mary '#:children))
(printf "~a~%" (keyword-get 'Mary '#:hobby))
(putprop! 'Mary (add1 (keyword-get 'Mary '#:age)) '#:age)
(printf "~a~%" (keyword-get 'Mary '#:age))
stdout
Standard output is empty