Tuliodnw
Tuliodnw

Reputation: 17

Improve Lisp function to group affected cases

Hi im making a program where you sort through different homeopathic remedies, one of the functions i do is a general search where a user will write a word or part of it and the program will reply with all the partial matches

(PRINTKEY 'FIEBER PLANTS);--> EXAMPLE
;CORDYCEPS IST FIEBERSENKEND
;BAIKAL-HELMKRAUT IST FIEBERSENKEND
;BAIKAL-HELMKRAUT VERRINGERT FIEBER
;EBOLAFIEBER WIRD DURCH EINEN KRANKHEIT VERSURSACHT
...

Can anyone help me so it doesn't look like this anymore

GINGER IS ANALGETIKUM

HOUTTUYNIA IS ANALGETIKUM

but instead group the plants like this.

ANALGETIKUM is a property of INGWER, HOUTTUYNIA

 (DEFPARAMETER PLANTS 
 '(
 ((NAME TRAGANT ASTRALAGUS )(BAKTERIEN )(VIREN HERPES-SIMPLEX BUNYAVIREN PORCINE-PARVOVIRUS PUNTA-TORO-VIREN CYTOMEGALOVIRUS ADENOVIREN COXSACKIE-VIRUS )(INFEKTIONSKRANKHEITEN HEPATITIS-B STAUPE JAPANISCHE-ENZEPHALITIS INFLUENZA INFEKTIOESE-BURSITIS-DER-HUEHNER )(EIGENSCHAFTEN ADAPTOGEN ANTIBAKTERIELL ANTIHEPATOTOXISCH ANTIVIRAL KARDIOPROTEKTIV DIURETIKUM BLUTDRUCKSENKEND IMMUNSTAERKER )(VERBESSERN BLUTKREISLAUF IMMUNFUNKTION )(VERRINGERN VIRALEN-INFEKTIONEN ))
 ((NAME CORDYCEPS CORDYCEPS )(BAKTERIEN CANDIDA-ALBICANS BACILLUS-SUBTILIS ENTEROCOCCUS-FAECALIS STAPHYLOCOCCUS-AUREUS CLOSTRIDIEN PLASMODIUM TUBERKELBAZILLUS )(VIREN HIV HERPES-SIMPLEX )(INFEKTIONSKRANKHEITEN HEPATITIS-B KREBS INFLUENZA NEWCASTLE-INFEKTION )(EIGENSCHAFTEN ANTIVIRAL ANTIASTHMATISCH ANTIBAKTERIELL ANTIKONVULSIVUM ENTZUENDUNGSHEMMEND ANTIMIKROBIELL ANTIOXIDATIONS FIEBERSENKEND ANTITUMORMITTEL ANTITUSSIVUM BRONCHIALREGULATOR KARDIOTONISCH SCHLEIMLOESEND HEPATOPROTEKTIV HYPOGLYKAEMISCH HYPOLIPIDAEMISCH IMMUNMODULATOR INSEKTIZID MITOCHONDRIEN-ADAPTOGEN NERVENBERUHIGUNG NEUROPROTEKTIV NIERENSCHUETZEND SCHLAFREGULIEREND STEROIDBILDEND )(VERRINGERN KONVULSIONEN ASTHMA VIRALEN-INFEKTIONEN ENTZUENDUNGEN FATIGUE HUSTEN SCHWINDELGEFUEHLE NYKTURIE )(VERBESSERN LIBIDO ))
 ((NAME BAIKAL-HELMKRAUT SCUTELLARIA-BAICALENSIS )(BAKTERIEN )(VIREN HRSV HIV HERPES-SIMPLEX PRRS-VIREN POLIOVIRUS PARAINFLUENZAVIRUS MOSAIKVIRUS EPSTEIN-BARR-VIRUS COXSACKIE-VIRUS ENTEROBAKTERIOPHAGE-MS2 ADENOVIREN )(INFEKTIONSKRANKHEITEN HEPATITIS-A HEPATITIS-B HEPATITIS-C SENDAIVIRUS-INFEKTION SARS-COV PARAINFLUENZA MASERN LEUKAEMIE INFEKTIOESE-BRONCHITIS STOMATITIS-VESICULARIS INFLUENZA )(EIGENSCHAFTEN ANODYNE ANTIANAPHYLAKTISCH ANTIANGIOGENE ANTIBAKTERIELL ANTIVIRAL ANTICHOLESTEROLEMIKUM ANTIKONVULSIVUM ANTIDIARRHOISCH ANTIDYSENTERISCH ANTIMYKOTISCH ANTIHYPERTENSIV ENTZUENDUNGSHEMMEND ANTIMETASTISCH ANTIOXIDATIONS ANTISPASMODISCH ANTITUMORMITTEL ADSTRINGIEREND CHOLAGOGUM DIURETIKUM SCHLEIMLOESEND FIEBERSENKEND BLUTSTILLEND HEPATOPROTEKTIV SEDATIVUM NERVENSTAERKEND NEUROPROTEKTIV )(VERBESSERN GEHIRNFUNKTION )(VERRINGERN VIRALEN-INFEKTIONEN FIEBER DURCHFALL DYSENTERIE KRAMPFANFALL KONVULSIONEN INSOMNIE ))
 ((NAME HOLUNDER SAMBUCUS )(BAKTERIEN )(VIREN HRSV HIV HERPES-SIMPLEX FELINE-CALICIVIRUS MURINE-NOROVIRUS ROTAVIRUS TABAKMOSAIKVIRUS CYTOMEGALOVIRUS JUNIN-VIRUS RHINOVIREN PORCINE-EPIDEMIC-DIARRHEA-VIRUS PORCINE-CIRCOVIRUS EPSTEIN-BARR-VIRUS ADENOVIREN POLIOVIRUS ENTEROVIREN COXSACKIE-VIRUS )(INFEKTIONSKRANKHEITEN HEPATITIS-B HEPATITIS-C HEPATITIS-E EBOLAFIEBER VOGELPOCKEN DENGUE SARS-COV STOMATITIS-VESICULARIS WEST-NILE-ENZEPHALITIS JAPANISCHE-ENZEPHALITIS STAUPE CHIKUNGUNYAFIEBER INFLUENZA )(EIGENSCHAFTEN ANTIVIRAL ANTIBAKTERIELL ANTIMYKOTISCH ANALGETISCH ENTZUENDUNGSHEMMEND ANTINOZIZEPTIV KREBSHEMMEND ANTIANGIOGEN ANTITERATOGEN SCHWEISSTREIBEND DIURETIKUM PROSTAGLANDIN-SYNTHESE-HEMMEND FIEBERSENKEND ANTIOXIDATIONS IMMUNSTIMULIEREND )(VERRINGERN FIEBER SCHMERZ ENTZUENDUNGEN SCHWELLUNGEN VIRALEN-INFEKTIONEN )(VERBESSERN SCHWITZEN IMMUNFUNKTION ERBRECHEN LEBERSCHUTZ ))
 ((NAME INGWER ZINGIBER-OFFICINALE )(BAKTERIEN )(VIREN HIV HERPES-SIMPLEX MOSAIKVIRUS POLIOVIRUS VACCINIAVIRUS EPSTEIN-BARR-VIRUS CYTOMEGALOVIRUS RHINOVIREN ENTEROVIREN )(INFEKTIONSKRANKHEITEN HEPATITIS-B HEPATITIS-C NEWCASTLE-INFEKTION WINDPOCKEN MASERN GELBFIEBER INFLUENZA ERKAELTUNG )(EIGENSCHAFTEN ANTIVIRAL ANALGETIKUM ANTHELMINTHIKUM ANTIARTHRITISCH ANTIBAKTERIELL ANTIDIARRHOISCH ANTIEMETIKUM ANTIMYKOTISCH ENTZUENDUNGSHEMMEND KRAMPFLOESEND ANTITUSSIVUM KARMINATIVUM KREISLAUFSTIMULANS SCHWEISSTREIBEND ELASTASE-HEMMER BLUTDRUCKSENKEND IMMUNSTAERKER SYNERGIST )(VERBESSERN SCHWITZEN IMMUNFUNKTION BLUTKREISLAUF )(VERRINGERN VIRALEN-INFEKTIONEN NASENSCHLEIMHAUT DURCHFALL MOMADE KRAMPFANFALL FIEBER SCHUETTELFROS ENTZUENDUNGEN HUSTEN ANGSTZUSTAENDE SCHMERZ ERKAELTUNG MIGRAENE KOPFSCHMERZEN ))
 ((NAME HOUTTUYNIA HOUTTUYNIA-CORDATA )(BAKTERIEN STREPTOCOCCUS-PNEUMONIAE-SEROTYP-2 )(VIREN HIV HERPES-SIMPLEX PED-VIRUS CYTOMEGALOVIRUS ENTERIC-CYTOPATHIC-HUMAN-ORPHAN ENTEROVIREN )(INFEKTIONSKRANKHEITEN INFEKTIOESE-BRONCHITIS INFLUENZA SARS-COV DENGUE )(EIGENSCHAFTEN ANTIVIRAL ANALGETIKUM ANTHELMINTHIKUM ANTIBAKTERIELL ANTIKREBS ANTIMYKOTISCH ENTZUENDUNGSHEMMEND ANTILEUKAEMISCH ANTIMIKROBIELL ANTIOXIDATIONS ANTITUSSIVUM ADSTRINGIEREND DIURETIKUM ENTSCHLACKEND EMMENAGOGUM FIEBERSENKEND BLUTSTILLEND HYPOGLYKAEMISCH IMMUNMODULATORISCH LARVAZIDUM ABFUEHRMITTEL AUGENHEILKUNDE )(VERRINGERN VIRALEN-INFEKTIONEN HARNWEGE-INFEKTIONEN NIEREN-INFEKTIONEN GENITALBEREICH-INFEKTIONEN DYSENTERIE DURCHFALL AUGES-INFEKTIONEN HAUT-INFEKTIONEN ))
 ((NAME WAID ISATIS )(BAKTERIEN )(VIREN HRSV HERPES-SIMPLEX PRRS-VIREN AUJESZKY-VIRUS CYTOMEGALOVIRUS EPSTEIN-BARR-VIRUS COXSACKIE-VIRUS ADENOVIREN )(INFEKTIONSKRANKHEITEN HEPATITIS-B GUERTELROSE NEWCASTLE-INFEKTION HFRS INFEKTIOESE-BRONCHITIS MASERN MUMPS WINDPOCKEN INFLUENZA SARS-COV ROETELN LEUKAEMIE )(EIGENSCHAFTEN ANTIVIRAL ANTIENTZUENDLICH FIEBERSENKEND ANTINOZIZEPTIV ANTIALLERGISCH TYROSINASE-HEMMER ANTIOXIDATIONS ANTIMYKOTISCH ANTIBAKTERIELL ANTIPARASITAER ANTILEUKAEMISCH ANTITUMOR UREASE-HEMMER SERIN-PROTEASE-HEMMSTOFF HEMMSTOFF-DER-BUTYRYCHOLINESTERASE LIPOXYGENASE-HEMMER ANTIENDOTOXIN DIOXIN-ANTAGONIST )(VERRINGERN VIRALEN-INFEKTIONEN )(VERBESSERN BLUTKREISLAUF ))
 ((NAME SUESSHOLZ GLYCYRRHIZA-GLABRA )(BAKTERIEN )(VIREN HRSV HIV HERPES-SIMPLEX CHANDIPURAVIREN AUJESZKY-VIRUS MURINE-RETROVIRUS PRRS-VIREN EPSTEIN-BARR-VIRUS POLIOVIRUS CYTOMEGALOVIRUS VACCINIAVIRUS ENTEROVIREN ROTAVIRUS ADENOVIREN COXSACKIE-VIRUS )(INFEKTIONSKRANKHEITEN HEPATITIS-A HEPATITIS-B HEPATITIS-C HEPATITIS-D HEPATITIS-E MASERN STOMATITIS-VESICULARIS NEWCASTLE-INFEKTION INFEKTIOESE-BRONCHITIS INFLUENZA SARS-COV HRSV PARAINFLUENZA JAPANISCHE-ENZEPHALITIS TICK-BORNE-ENCEPHALITIS WEST-NILE-ENZEPHALITIS BOVINE-IMMUNODEFICIENCY WINDPOCKEN GELBFIEBER DENGUE PNEUMONIE )(EIGENSCHAFTEN ANTIVIRAL NEBENNIERENRINDE-STIMULANS NEBENNIERE-TONIKUM SCHMERZSTILLEND ANTIBAKTERIELL KREBSHEMMEND ANTITUMORMITTEL ANTIHAEMOLYTISCH ANTIHYPERGLYKAEMISCH ENTZUENDUNGSHEMMEND ANTIOXIDATIONS KRAMPFLOESEND ANTISTRESSIVUM ANTITUSSIVUM GEGEN-MAGENGESCHWUERE KARDIOPROTEKTIV ABFUEHRMITTEL OESTROGENE SCHLEIMLOESEND HEMMSTOFF-DER-MAGENSEKRETION HEPATOPROTEKTIV IMMUNSTIMULIEREND ABFUEHRMITTEL SCHLEIMHAUTSCHUETZEND STRAHLENSCHUTZ MUSKELENTSPANNER STIMULANS-BAUCHSPEICHELDRUESE SYNERGIST STIMULANS-THYMUSDRUESE TYROSINASE-HEMMER XANTHIN-OXIDASE-HEMMER )(VERRINGERN SCHMERZ MUND-BAKTERIELLEN-INFEKTIONEN VIRALEN-INFEKTIONEN KRAMPFANFALL GESCHWUERBILDUNG )(VERBESSERN IMMUNFUNKTION ))
 ((NAME LOMATIUM LOMATIUM )(BAKTERIEN SHIGELLA )(VIREN HIV EPSTEIN-BARR-VIRUS CYTOMEGALOVIRUS )(INFEKTIONSKRANKHEITEN BAKTERIELLE-INFEKTIONEN INFLUENZA SARS-COV VIRAL-ENCEPHALITIS PNEUMONIE )(EIGENSCHAFTEN SCHMERZSTILLEND ANTIBAKTERIELL ANTIMYKOTISCH ANTIMIKROBIELL ANTISEPTISCH KRAMPFLOESEND ANTIVIRAL SCHLEIMLOESEND SCHLEIMHAUT-TONIKUM )(VERRINGERN KRAMPFANFALL SCHMERZ VIRALEN-INFEKTIONEN BAKTERIELLEN-INFEKTIONEN ))
 ((NAME WASSERDOST EUPATORIUM-PERFOLIATUM )(BAKTERIEN )(VIREN )(INFEKTIONSKRANKHEITEN INFLUENZA MALARIA DENGUE )(EIGENSCHAFTEN SCHMERZSTILLEND ANTIBAKTERIELL ENTZUENDUNGSHEMMEND ZYTOTOXISCH SCHWEISSTREIBEND BRECHMITTEL FIEBERSENKEND BITTER-DEN-MAGEN IMMUNSTIMULIEREND SCHLEIMHAUT-TONIKUM BLUTSTILLEND GLATTER-MUSKEL-ENTSPANNEND )(VERRINGERN VIRALEN-INFEKTIONEN FIEBER SCHMERZ )(VERBESSERN SCHLEIMHAUT BLUTKREISLAUF SCHWITZEN ))
 ((NAME SAECKELBLUME CEANOTHUS-AMERICANUS )(BAKTERIEN )(VIREN )(INFEKTIONSKRANKHEITEN INFLUENZA)(EIGENSCHAFTEN LYMPHSYSTEMS-STIMULANS LYMPHSYSTEM-TONIKUM BLUTGERINNUNGSMITTEL )(VERRINGERN ENTZUENDUNGEN )(VERBESSERN LYMPHSYSTEMS BLUTKREISLAUF ))
 ((NAME ROSENWURZ RHODIOLA-ROSEA )(BAKTERIEN STAPHYLOCOCCUS-AUREUS BACILLUS-SUBTILIS TUBERKELBAZILLUS E-COLI )(VIREN COXSACKIE-VIRUS ENTEROVIREN )(INFEKTIONSKRANKHEITEN HEPATITIS-C JAPANISCHE-ENZEPHALITIS INFLUENZA )(EIGENSCHAFTEN ADAPTOGEN NEBENNIEREPROTEKTIV ANTI-KREBS ANTIDEPRESSIVUM GEGEN-MUEDIGKEIT ANTIOXIDATIONS ANTISTRESSIVUM KARDIOTONISCH ENDOKRINES-TONIKUM ERGOGEN HIPPOCAMPUS-SCHUTZMITTEL HIPPOCAMPUS-TONIKUM HYPOXIE-ANTAGONIST IMMUNSTAERKER MITOCHONDRIEN-STAERKEN MUSKELN-STIMULANS NERVENSYSTEMS-TONIKUM NERVENPROTEKTIV SYNERGIST )(VERRINGERN STRESS DEPRESSION FATIGUE ERSCHOEPFUNG GEHIRNNEBEL )(VERBESSERN MITOCHONDRIEN MUSKELN NERVENSYSTEMS ENDOKRINES IMMUNFUNKTION ))
 ))

;FUNCTION PRINTKEY 
;ARRANGES THE INFORMATION NEEDED TO SEARCH FOR THE KEYWORD
;@PARAM KEYWORD: {STRING}, SEARCHED KEYWORD
;@PARAM LIS: {LIST}, LIST WITH ALL INFORMATION ABOUT THE PLANTS, INFECTIOUS DISEASES, PROPERTIES AND THERAPY TARGETS.
;@PARAM PLANT: {STRING}, NAME OF THE NOW ACTIVE PLANT.
(DEFUN PRINTKEY(KEYWORD LIS)
(LET*((PLANT (SECOND (ASSOC 'NAME (CAR LIS)))))
(COND ((NULL LIS))
    (T (PRINTKEY-HELPER KEYWORD (CDR (ASSOC 'NAME (CAR LIS))) 'NAME PLANT)
        (PRINTKEY-HELPER KEYWORD (CDR (ASSOC 'VIREN (CAR LIS)))) 'VIREN PLANT)
        (PRINTKEY-HELPER KEYWORD (CDR (ASSOC 'BACTERIA (CAR LIS))) 'BACTERIA PLANT)
        (PRINTKEY-HELPER KEYWORD (CDR (ASSOC 'INFECTIOUS DISEASES (CAR LIS))) 'INFECTIOUS DISEASES PLANT)
        (PRINTKEY-HELPER KEYWORD (CDR (ASSOC 'PROPERTIES (CAR LIS))) 'PROPERTIES PLANT)
        (PRINTKEY-HELPER KEYWORD (CDR (ASSOC 'REDUCE (CAR LIS))) 'DECREASE PLANT)
        (PRINTKEY-HELPER KEYWORD (CDR (ASSOC 'IMPROVE (CAR LIS)))) 'IMPROVE PLANT)
        (PRINTKEY KEYWORD (CDR LIS)))
)))

;FUNCTION PRINTKEY-HELPER
;SEARCHES FOR KEYWORD IN DATABASE AND PRINTS ALL PARTIAL MATCHES
;@PARAM KEYWORD: {STRING}, SEARCHED KEYWORD
;@PARAM LIS: {LIST}, LIST WITH ALL INFORMATION ABOUT THE PLANTS, INFECTIOUS DISEASES, PROPERTIES AND THERAPY TARGETS.
;@PARAM TYPE: {STRING}, NAME OF THE SEARCHED TYPE ('REDUCE, 'IMPROVE, 'PROPERTIES, 'NAME OR 'VIRUSES).
;@PARAM PLANT: {STRING}, NAME OF THE NOW ACTIVE PLANT.
(DEFUN PRINTKEY-HELPER(KEYWORD LIS TYPE PLANT)
(LET*((FOUND (SEARCH (STRING KEYWORD)(STRING (CAR LIS)) :TEST 'CHAR=))
(COND((NULL LIS))
    ((EQUAL KEYWORD 'HP)(START))
    ((AND (EQL TYPE 'NAME)(NOT (NULL FOUND)))(FORMAT T "~%~A IS AN ANTIBACTERIAL AND ANTIVIRAL PLANT WITH ANTIOXIDANT PROPERTIES."(CAR LIS))(PRINTKEY-HELPER KEYWORD (CDR LIS) TYPE PLANT))
    ((AND (EQL TYPE 'VIRUSES)(NOT (NULL FOUND)))(FORMAT T "~%~A IS CAUSED BY A VIRUS" (CAR LIS))(PRINTKEY-HELPER KEYWORD (CDR LIS) TYPE PLANT))
    ((AND (EQL TYPE 'INFECTIOUS DISEASES)(NOT (NULL FOUND)))(FORMAT T "~%~A IS CAUSED BY A DISEASE" (CAR LIS))(PRINTKEY-HELPER KEYWORD (CDR LIS) TYPE PLANT))
    ((AND (EQL TYPE 'BACTERIA)(NOT (NULL FOUND)))(FORMAT T "~%~A IS CAUSED BY A BACTERIA" (CAR LIS))(PRINTKEY-HELPER KEYWORD (CDR LIS) TYPE PLANT))
    ((AND (EQL TYPE 'PROPERTIES)(NOT (NULL FOUND)))(FORMAT T "~%~A IS ~A" PLANT (CAR LIS))(PRINTKEY-HELPER KEYWORD (CDR LIS) TYPE PLANT))
    ((AND (EQL TYPE 'DECREASE)(NOT (NULL FOUND)))(FORMAT T "~%~A DECREASES ~A" PLANT (CAR LIS))(PRINTKEY-HELPER KEYWORD (CDR LIS) TYPE PLANT))
    ((AND (EQL TYPE 'IMPROVE)(NOT (NULL FOUND)))(FORMAT T "~%~A IMPROVES ~A" PLANT (CAR LIS))(PRINTKEY-HELPER KEYWORD (CDR LIS) TYPE PLANT))
    (T (PRINTKEY-HELPER KEYWORD (CDR LIS) TYPE PLANT))
)))

i accept ideas of how to do it

in PRINTKEY-HELPER i can use this
(FORMAT T "~A is a property of ~{~a~^, ~}.~%"(CAR LIS) (APPLY #'APPEND (MAPCAR (LAMBDA (ROW)(IF (FIND (CAR LIS) (CDR (ASSOC 'EIGENSCHAFTEN ROW))) (LIST(SECOND (ASSOC 'NAME ROW))))) PLANTS)))

but if when the word comes again the string will be repeated

Upvotes: 0

Views: 51

Answers (1)

Kaz
Kaz

Reputation: 58578

Here is a what a somewhat more more tidy printkey-helper might look like, though I have not tested the code. I fixed the unbalanced parenthesis in the let* form.

(defun printkey-helper (keyword lis type plant)
  (let* ((name (car lis)) ;; get name as local var to avoid repeating (car lis)
         (found (search (string keyword) (string name) :test 'char=)))
    (if found
      (cond
        ((eq keyword 'hp) (start)) ;; what is this? Not mentioned in comment.
        (t (case type
             (name (format t "~%~a is an antibacterial and antiviral plant with antioxidant properties." name))
             (viruses (format t "~%~a is caused by a virus" name))
             (infectious (format t "~%~a is caused by a disease" name))
             (bacteria (format t "~%~a is caused by a bacteria" name))
             (properties (format t "~%~a is ~a" plant name))
             (decrease (format t "~%~a decreases ~a" plant name))
             (improve (format t "~%~a improves ~a" plant name)))
           ;; tail recurse in one place
           (printkey-helper keyword (cdr lis) type plant))))))

I also removed the article "a" from "a bacteria" becuase the word is a plural of "bacterium". A bacterial disease is caused by a bacterium, or by multiple bacteria.

All that written and said, the way the search task is divided between printkey and printkey-helper isn't very good.

Why wouldn't you just loop through the plants in a single loop, picking out the matching ones, and then loop through the properties, printing all of the known ones with a descriptive text.

A helper function could be used to do the formatting of a property like infectious to the textual message.

(defun print-recognized-property (type plant-name)
  (case type
    (name (format t "~%~a is an antibacterial and antiviral plant with antioxidant properties." name)
    ;; ... etc
    ))

Then if we have a descriptor of a given plant, we can do something along these lines:

(loop for ((name-sym common-name latin-name) . properties) in plants
      do (loop for (type . info) in properties
               do (print-recognized-property type common-name)))

Upvotes: 1

Related Questions