Programmation utilisant le type de somme directe en Java (news)

(Je ne suis pas sûr de Java) J'ai pensé qu'il serait bien de prendre en charge le type de somme directe par défaut. J'ai également créé un «interpréteur qui calcule des formules en notation polonaise inverse (comme« 1 2 + »=« 3 »)» pour étudier en utilisant le type de somme directe.

Le code que j'ai écrit cette fois

package neta;

import java.util.Stack;

public class Main {
    //Un type qui représente un type numérique
    static class IntType extends Exception {
        int v;
        IntType(int v) {
            this.v = v;
        }

        @Override
        public String toString() {
            return Integer.toString(v);
        }
    }

    //Un type qui représente une opération positive
    static class PlusOperation extends Exception {
        @Override
        public String toString() {
            return "+";
        }
    }

    private static void eval(String statement) throws IntType, PlusOperation {
        try {
            throw new IntType(Integer.parseInt(statement));
        } catch (NumberFormatException e) {
            if (statement.equals("+")) {
                throw new PlusOperation();
            } else {
                //Utilisez Stack pour calculer la notation polonaise inversée
                Stack<Integer> stack = new Stack<>();
                //Les jetons peuvent être séparés par des espaces
                for (String s : statement.split(" ")) {
                    try {
                        eval(s);
                    } catch (IntType iv) {
                        stack.push(iv.v);
                    } catch (PlusOperation op) {
                        stack.push(stack.pop() + stack.pop());
                    }
                }
                throw new IntType(stack.pop());
            }
        }
    }

    private static void test(String statement) {
        try {
            eval(statement);
        } catch (IntType | PlusOperation e) {
            System.out.println(e);
        }
    }

    public static void main(String[] args) {
        test("1");
        test("1 2 +");
        test("3 4 + 5 +");
        test("6 7 8 + +");
        test("+");
    }
}

Lorsque j'exécute ce programme, j'obtiens la sortie suivante:

1
3
12
21
+

Commentaire

Type de retour

Il semble que le mot-clé throws soit utilisé dans la définition de la fonction pour indiquer le type de retour.

//Exemple
void eval(String statement) throws IntType, PlusOperation

Dans cet exemple, le type de somme directe de ʻIntType et PlusOperationest le type de retour de la fonction ʻeval (). C'est cool d'écrire le type de retour après le nom de la fonction, comme dans les langages de programmation modernes (Go / Rust / ..). Je ne suis pas sûr que le mot-clé qui représente une fonction soit «void», mais je pense qu'il est grammaticalement basé sur les dernières tendances linguistiques.

Renvoie une valeur

Il semble utiliser le mot-clé throw lors du retour d'une valeur. Je pense que de nombreux langages de programmation utilisent des mots clés comme «return», mais c'est rare.

//Exemple:Renvoie un type numérique
throw new IntType(Integer.parseInt(statement));

//Exemple:Renvoie l'opérateur d'addition
throw new PlusOperation();

Notez que lorsque vous retournez une valeur, vous devez en faire une instance d'une classe avec ʻextends Exception, comme ʻIntType, ou vous obtiendrez une erreur de compilation. C'est un peu gênant.

Traitement selon le type

Utilisez try / catch pour la branche conditionnelle selon le type. C'est comme Scala ou une correspondance / cas de langage moderne.

try {
    eval(s);
} catch (IntType iv) {
    //Traitement selon le type
} catch (PlusOperation op) {
    //Traitement selon le type
}

Dans une langue avec une longue histoire, il semble qu'un modèle de visiteur soit utilisé, ou qu'un type soit vérifié et ramifié avec quelque chose comme ʻinstanceof`.

Erreur

Comme le langage Go, il semble entraîner une erreur de compilation si vous ne vérifiez pas l'erreur renvoyée.

try {
    throw new IntType(Integer.parseInt(statement));
} catch (NumberFormatException e) {
    //Que faire si une valeur de type d'erreur est renvoyée
}

Dans ce qui précède, vous pouvez écrire un traitement normal à la fois, et vous n'avez pas à vérifier l'erreur de valeur de retour une par une, c'est donc comme une monade.

Recommended Posts

Programmation utilisant le type de somme directe en Java (news)
Programmation par contraintes en Java
[Java] Termes de base en programmation
Chapitre 2 Programmation réseau par JAVA phttpd Collecte d'exceptions en 3 endroits
Analyse morphologique en Java avec Kuromoji
Liste des types ajoutés dans Java 9
Tweak Markdown avec Java flexmark-java
Utilisez OpenCV_Contrib (ArUco) avec Java! (Partie 2-Programmation)
[Java] Rédiger un quiz de programmation SET INTERSECTION avec StreamAPI en une seule ligne
Lire le fichier xlsx en Java avec Selenium
Diviser une chaîne avec ". (Dot)" en Java
Gérez d'énormes JSON avec Java Lambda
Créer un CSR avec des informations étendues en Java
Outil GUI refactorisé réalisé avec Java8 + JavaFX en 2016
Analyse de code statique par Checkstyle avec Java + Gradle
L'histoire de l'apprentissage de Java dans la première programmation
Extraction de texte en Java à partir de PDF avec pdfbox-2.0.8
Entraînez-vous à travailler avec des paires de substitution Unicode en Java
[JAVA] [Spring] [MyBatis] Utiliser IN () avec SQL Builder
S'entendre avec les conteneurs Java dans Cloud Run
bases de la programmation Java
Changements dans Java 11
Janken à Java
Programmation générique java
Comment appeler des fonctions en bloc avec la réflexion Java
Inclure l'image dans le fichier jar avec la méthode statique java
Exercices de programmation Java pour les nouveaux arrivants impopulaires auprès des ingénieurs actifs
Implémentez rapidement singleton avec enum en Java
Résolution du problème lorsque Azure Functions a cessé de fonctionner en Java
Sortie true avec if (a == 1 && a == 2 && a == 3) en Java (identifiant invisible)
Vérifiez la couverture avec Codecov dans la configuration Java + Gradle + Wercker
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~