Добавить на карту внутри диалекта синтаксического анализа

Я хочу создать map, где хэш связан с URL-адресом, чтобы проверить, находится ли какой-либо URL-адрес в map. Если его еще нет в map, добавьте его (и URL-адрес) к нему.

parseContainer: func [cstr [string!]] [
    parse cstr [
        thru "<a href=" to {"}
        thru "http://" copy quarto_url to {"}
        (
            quarto_hash: checksum/method to-binary quarto_url 'md5
            old: find words-of checksums 'quarto_hash
            if not old [append checksums [quarto_hash quarto_url ]]
        )
    ]
]

Но слова quarto_hash и quarto_url не преобразуются в свои значения. Возможно, это не самый простой подход к проблеме, поэтому я подожду вашего ответа. Еще один вопрос: может ли map быстро обрабатывать вставку и поиск элементов для тысяч элементов или есть какой-либо другой более подходящий тип?

К вашему сведению, я использую Rebol3, но также включил тег Red, потому что в ближайшем будущем я также буду использовать Red. Каков наилучший подход для этого?


person Luis    schedule 30.06.2015    source источник


Ответы (2)


Вам нужно сократить слова quarto_hash и quarto_url.

if not old [append checksums reduce [quarto_hash quarto_url ]]

Также нет необходимости извлекать слова карты, вы должны быть быстрее с выбором прямого на карте

я хотел бы использовать

if not select checksums quarto_hash [
    append checksums reduce [quarto_hash quarto_url ]
]
person sqlab    schedule 30.06.2015

Вам необходимо выполнить одно из следующих действий:

if not old [repend checksums [quarto_hash quarto_url]]

or

if not old [append checksums reduce [quarto_hash quarto_url]]

Теперь вы обнаружите, что quarto_hash и quarto_url оцениваются перед добавлением в карту checksums (хэш).

Что касается map вставки/поиска, вы найдете примеры ниже проще/быстрее:

>> checksums: map []
== make map! [
]

>> quarto-url: "www.draegtun.com"
== "www.draegtun.com"

>> quarto-hash: checksum/method to-binary quarto-url 'md5
== #{D9F71DD455C3E84E7C5C8F2C23FDF174}

>> checksums/:quarto-hash
== none

>> ;;  returns NONE if key not present in map

>> checksums/:quarto-hash: quarto-url    
== "www.draegtun.com"

>> checksums
== make map! [
    #{D9F71DD455C3E84E7C5C8F2C23FDF174} "www.draegtun.com"
]
person draegtun    schedule 30.06.2015
comment
Интересный синтаксис checksums/:quarto-hash: quarto-url, но он не работает в моем интерпретаторе 3.0.0.4.40 Rebol 3. - person Luis; 30.06.2015
comment
Привет @Luis, В приведенных выше примерах используется синтаксис path!, и этот использование было разработано специально для Rebol 3 (здесь они были введены дословно в консоль Rebol и скопированы / вставлены в ответ). Какие ошибки вы получили? - person draegtun; 30.06.2015
comment
Извините, попробовал еще раз в новой консоли и все заработало :-) Большое спасибо за объяснение! - person Luis; 30.06.2015