Zastanawiam się, czy istnieje sposób, w jaki mogę zmusić getf do porównania przy użyciu równości zamiast eq? Używam ccl realizacji wspólnego seplenienia.Czy użycie getf może być równe dla porównania zamiast eq? (zwykłe seplenienie)
Odpowiedz
Nie. Musisz użyć innej funkcji; coś około jak to może zrobić to, czego potrzebujesz:
(defun equal-getf (plist indicator)
(second (member indicator plist :test #'equal)))
Edycja
Oto ustalona wersja, która traktuje listę odpowiednio jako pary klucz/wartość:
(defun equal-getf (plist indicator)
(loop for key in plist by #'cddr
for value in (rest plist) by #'cddr
when (equal key indicator)
return value))
nie wiem wiedzieć, czy istnieje sposób na "przesłonięcie" wartości domyślnej, sprawdź, czy możesz znaleźć impę przy użyciu (describe 'getf)
lub (symbol-plist 'getf)
. Możliwym semplified realizacja może być
(defun mgetf (l v) (if (< (length l) 2) NIL (if (equal (car l) v) (car (cdr l)) (mgetf (nthcdr 2 l) v))))
EDITED: użyj nthcdr zamiast podwójnej cdr.
bardzo naiwnego implanta w porównaniu do innego rozwiązania ... trochę zardzewiałego z seplem (którego obecnie używam tylko dla emacs ..., gdy jest potrzebny) ... – ShinTakezou
To powinno załatwić sprawę. Nie jest ładnie rekurencyjny, ale wykorzystuje prostą aplikację LOOP. Aby umożliwić mu użycie arbitralnego predykatu równoważności, trasa do zastosowania opcjonalnego argumentu powinna być prosta.
(defun mgetf (place indicator)
(loop for (key value . rest) on place by #'cddr
if (equal key indicator)
do (return value)))
- 1. Dokonywanie ograniczenie Być może gdzie Eq a
- 2. x86 Instrukcja porównania, która używa XOR zamiast odejmowania
- 3. WinRT Co może być zamiast AncestorType?
- 4. Wymagania dla std :: thread :: id. Czy może być atomizowany?
- 5. C# Użycie obiektu zamiast odniesienia dla List.Contains()
- 6. Czy JavaScript może być bootowany?
- 7. wspólne seplenienie: wartość szczeliny dla struktur zerwanych
- 8. Kiedy `starmap` może być preferowany zamiast `List Comprehension`
- 9. Różnica między ": eq()" i .eq()
- 10. Jeśli dwie rzeczy nie są równe, czy są równe?
- 11. Ruby gem dla porównania tekstu
- 12. Czy biblioteka wykresów ZedGraph dla .NET może być zalecana?
- 13. Czy język może być Turing-complete bez wsparcia dla tablic?
- 14. Czy GitHub dla Windows może być używany lokalnie?
- 15. Czy $ _SERVER ['SERVER_NAME'] może być podrobiony/sfałszowany?
- 16. Czy operator obsady może być jawny?
- 17. Opcja/być może klasa dla C++
- 18. Czy istnieje limit rekursji w seplenienie?
- 19. Czy ładowanie eksportowanych symboli może być opóźnione?
- 20. Czy REST w praktyce może być bezpaństwowcem?
- 21. Naprawdę minimum seplenienie
- 22. Czy ta próbka skrótu może być krótsza?
- 23. WINDOW_SERVICE nie może być rozwiązany dla zmiennej
- 24. Jak utworzyć typ wystąpienia Eq
- 25. Czy konieczne jest użycie === do porównania ciągów w JavaScript lub czy wystarczająca jest ilość ==?
- 26. Dlaczego konieczne jest użycie @ @ id zamiast @id?
- 27. Czy zdalny adres URL zamiast nazwy może być używany do odszukiwania oddziałów?
- 28. Czy ikona Google +1 może być dostosowywana?
- 29. Czy javascript może być wbudowany w WebPacka?
- 30. Czy std :: function może być serializowane?
W najlepszym rozwiązaniem, jednak nie jest to „błąd”: to nie traktuje listę jako pary „kluczowych wartości”, tak że (równej getf „(ABCD)” b) zwraca C while (getf "(abcd)" b) zwraca NIL. Po prostu bądź świadomy tego – ShinTakezou