6
votes

Comment passer des variables comme noms variables à une fonction?

Je veux pouvoir faire le pseudocode suivant:

  1. passe dans le symbole A. li>
  2. passe dans le symbole b. li>
  3. passez dans une expression utilisant A et B li>
  4. Comme je change la valeur d'A et B, imprimez la sortie de C à chaque instant. LI> ol>

    idéalement, je voudrais que la signature ressemble à: p> xxx pré>

    mais je ne suis pas sûr que j'approche cela correctement ... je J'ai essayé de changer la fonction sur p> xxx pré>

    et cet exemple plus compliqué: p> xxx pré>

    mais cela fait un + sur ' A et 'B Avant de marcher dans le coureur. P>

    Voici mon premier coup de clojure: P>

    (defn runner [a b c] (
      (for [i (range 10)
            j (range 10)] (println i j (c i j))
    


0 commentaires

4 Réponses :


0
votes

Je ferais sa signature être quelque chose comme

(coureur Alen Blen op)

Exemple:

(coureur 10 10 +)


4 commentaires

mais si je veux faire: (coureur A B (+ (- A B) (- B a))


Le concept qui vous manque est qu'une opération complexe ou une simple opération est toutes deux des opérations seulement - vous nourrissez [1-10] [1-10] dans une fonction - que ce soit simple ou complexe n'a pas d'importance aussi longtemps que Il faut deux arguments.


Lol et je ne peux pas m'empêcher de remarquer ... (+ (- A b) (- B a) (- B a)) toujours à 0 :) Mais je comprends ce que vous dites.


Ok, mais cela ne tient pas compte (Baker capable de coureur (Charlie Cable Baker)) Renvoyer la même sortie que (Barre FOO de Runner Foo (barrlie Foo Bar) et (Baz Foo Bar (Baz Foo Bar)) renvoyant une sortie différente



0
votes

Je ne suis pas vraiment sûr que je réponde à la bonne question. Je pense "si je passe une fonction un symbole au lieu d'une valeur Comment peut-il utiliser la valeur que le symbole représente? Est-ce que ferme?

(def a 4)
(defn my-inc [x] (+ (eval x) 1))
user> (my-inc 'a)
5


0 commentaires

0
votes

Il n'est pas assez clair pour moi ce que vous essayez d'atteindre, mais ce qui suit est une réponse à ce que je suppose que c'est votre question: xxx

Notez que le style ci-dessus est probablement pas ce que vous devriez faire. Demandez une meilleure question et nous vous donnerons de meilleures réponses.


0 commentaires

4
votes

Les arguments de la fonction sont toujours évalués avant que la fonction ne soit appelée. Si vous souhaitez différer l'évaluation ou représenter un certain calcul ou un code comme objet, vous avez quelques options:

  1. Utilisez une fonction (voir mon code ci-dessous)
  2. Utilisez une macro et épissez un peu de code dans un autre code que la macro génère
  3. Pass code en tant que liste citée et EVAL IT.

    Utiliser une fonction est ce que vous voulez faire 99% du temps. 1% du temps, vous voulez des macros. Vous n'auriez jamais besoin de eval sauf si vous ne générez pas de code à l'exécution ou de faire des objets très vissés. xxx

    ceci pourrait également être écrit comme (Runner # (+% 1% 2) ou même simplement (Runner +) .

    Il n'est pas nécessaire de passer " A "et" b "dans la fonction comme arguments. doseq et pour introduisez leurs propres noms locaux et lexiquement scopés pour des choses. Il n'y a aucune raison ils doivent utiliser A et b ; tout nom va faire. C'est la même chose pour fn . J'ai utilisé x et y ici parce que cela n'a pas d'importance.

    J'aurais pu utiliser a et B dans le fn le corps aussi, mais ils auraient été un différent A et B que ceux du doseq voit. Vous voudrez peut-être lire sur Portée si cela ne " t faire sens.


1 commentaires

Ce n'est pas la réponse que je cherchais, mais je posais la mauvaise question. Merci d'avoir fourni une voie à l'illumination.