Использование функции-члена в схеме - PullRequest
2 голосов
/ 26 октября 2010

Это мой код:

   (define p (read(open-input-file "starbucks4.sxml")))

(define get-artifacts
  (lambda (l)
   (member (list 'opm:artifact) l)))



  (get-artifacts p)

Мне сказали, что функция-член выполняет полный поиск по всему списку.В документе .sxml есть сложный список, который имеет много элементов, называемых "opm: artifact", однако этот метод возвращает #f и никакого списка.

Может кто-нибудь увидеть, что я делаю неправильно?

Пример файла .sxml:

      (opm:account ((ref "detailedAccount")))
   "\n            "
   (opm:label ((value "Provide other Beverage")))
   "\n        ")
  "\n    ")
 "\n    "
 (opm:artifacts
  ()
  "\n        "
  (opm:artifact
   ((id "a1"))
   "\n            "
   (opm:account ((ref "detailedAccount")))
   "\n            "
   (opm:label ((value "order")))
   "\n        ")
  "\n        "
  (opm:artifact
   ((id "a2"))
   "\n            "
   (opm:account ((ref "detailedAccount")))
   "\n            "
   (opm:label ((value "cash")))
   "\n        ")
  "\n        "

Я пытаюсь найти все артефакты opm:связанные данные (это подсписки).

Ответы [ 3 ]

2 голосов
/ 26 октября 2010

Он выполняет поиск по всему списку, но не ищет подсписки.

Так что, если ваш список на самом деле является вложенным списком и (opm:artifact) находится только в одном из его подсписков, memberне найдет его.

Также обратите внимание, что вы ищете список (opm:artifact), а не символ opm:artifact или любой список, содержащий opm:artifact.

Редактировать: Для поискаПодсписки вы можете сделать что-то вроде этого:

(define (deep-search x lst)
  (if (empty? lst)
    #f
    (if (equal? x (car lst))
      #t
      (begin
        (if (list? (car lst))
          (let ((r (deep-search x (car lst))))
               (if r
                 r
                 (deep-search x (cdr lst))))
          (deep-search x (cdr lst)))))))
0 голосов
/ 03 ноября 2010

Держись, я могу сделать твою жизнь намного проще.Исходя из вашего имени файла "starbucks.sxml", похоже, что вы уже используете пакет sxml racket.Если это так, то вы также можете использовать часть этой библиотеки 'sxpath', чтобы значительно упростить ваш код:

#lang racket

(require (planet lizorkin/sxml:2:1/sxpath))

(define tree (file->value "/tmp/starbucks.sxml"))

(define artifact-filter (sxpath '(opm:artifact)))

(artifact-filter tree)

Возвращает список узлов opm: artifact (включая все, что находится внутри них).Например, когда я запустил его на фрагменте, который вы указали выше (плюс кучу вставленных открытых паренов - они не были сбалансированы - я получил это:

Welcome to DrRacket, version 5.0.2.1--2010-10-27(41c084c/g) [3m].
Language: racket; memory limit: 512 MB.
'((opm:artifact
   ((id "a1"))
   "\n            "
   (opm:account ((ref "detailedAccount")))
   "\n            "
   (opm:label ((value "order")))
   "\n        ")
  (opm:artifact
   ((id "a2"))
   "\n            "
   (opm:account ((ref "detailedAccount")))
   "\n            "
   (opm:label ((value "cash")))
   "\n        "))

Документация для всего sxmlпакет действительно плохой ... возможно, слово "несуществующий" было бы более подходящим словом, если быть честным, люди sxml заинтересованы в поддержке всех схем, а не только ракеток, поэтому их, конечно, можно простить, если они не тратят много времени на написаниедокументация в формате Racket, Scribble.

0 голосов
/ 26 октября 2010

Первое, что я заметил, это то, что вы даете список одного элемента в качестве первого аргумента для member. Член работает так:

>>> (member 2 '(4 5 2 6 7))
(2 6 7)

Можете ли вы дать нам образец того, как выглядит p, и что вы хотите в результате?

...